Skip to main content

Full text of "Maxon Pascal 3 Handbuch"

See other formats


PASCAL 3 


Integriertes 

Pascal-Compilersystem 





AMIGA 


MaxonPASCAL 


Integriertes Pascal-Compilersystem 



MAXOfI 

fcomputer 


MaxonPASCAL 3 

Autoren: 

Compiler: Jens Gelhar 

Editor: Thomas E. VWeger 

Units/Includes: Jürgen Schmitz 


© 1989-94 MAXON Computer GmbH 

Alle Rechte Vorbehalten. Dieses Handbuch und die dazugehörige Software ist urheberrechtlich 
geschützt. Es darf in keiner Form (auch auszugsweise) mittels ii^endwelcher Verfahren 
reproduziert, gesendet, venaelfaitigt bzw. verbreitet oder in eine andere Sprache übersetzt 
werden. 

Bei der Erstellung des Programmes, der Anleitung sowie Abbildungen wurde mit allergrößter 
Sorgfalt vorgegangen. Trotzdem können Fehler nicht ausgeschlossen werden. MAXON 
übernimmt keinerlei Haftung für Schäden, die auf eine Fehlftmktion von Programmen 
zurückzuführen sind. 

Alle Informationen, die in der vorliegenden Anleitung enthalten sind, werden ohne Rücksicht 
aut einen eventuellen Patentschutz veröffentlicht. Ebenso werden Warenzeichen ohne 
Gewährleistung einer freien Verwendung benutzt. 


Support 


Bei Fragen zu MaxonPASCAL 3 wenden Sie sich bitte an: 


MAXON Computer GmbH 
“MaxonPASCAL 3 Support” 
Po.stfach 5969 
65734 Eschborn 


Copyrights und Warenzeichen: 

Commodore® und Amiga® sind eingetragene Warenzeichen der Commodore- 
Amiga Inc. 

AmigaDOS “, Kickstart'“, Intuition” und Workbench” sind Warenzeichen der 
Commodore-Amiga Inc. 

Amiga Workbench”ist ein Copyright der Commodore Amiga inc. 

MAXON® ist ein eingetragenes Warenzeichen der MAXON Computer GmbH 



MAXON Software-Lizenzbedingungen 


1 AllKemeines 

Gegenstand dieses Venrages isl das Benulzungsreehl l'tir MAXON Compulerprogrammc, lürdie Benutzungsanleilung 
sowie für sonstiges zugehöriges schrit'tliehes Material, nachfolgend zusarnmenfassend als Software bezeichnet. 

2 VerviellaltiBungsreehle 

(1) Der Anwender darf das gelieferte Programm vervielfältigen, soweit die jeweilige Vervielfältigung für die Benutzung 
des Programms notwendig ist. Zu den notwendigen Vervielfältigungen zählen die Installation des Programms vom 
Originaldateniräger auf den Massenspeieher der eingesetzten 1 lardware .sowie das Laden des Programms in den 
Arheit.sspeicher. 

(2) Darüber hinaus kann der Anwender eine Vervielfältigung zu Sicherungsz.wecken vornehmen. Es darf jedoch jeweils 
nur eine einzige Sicherungskopie angefertigt und aufliewahrt werden. Diese Sieherangskopie ist als solche des überlasse¬ 
nen Programms zu kennzeichnen. 

(31 Weitere Verviellaltigungen. zu denen auch die Ausgaiie des Programmcodes auf einen Drucker sowie das 
Fotokopieren des Handbuchs zählen, darf der Anwender nicht anfertigen. 

3 Melirfiielinulzungen und Netzwerkeinsatz 

(1) Der Anwender darf die Software auf jeder ihm zur Verfügung stehenden Hardware einselzen. W/echsell der 
Anwender jedoch die Hardware, muß er die Software vom Massenspeieher der bisher verwendeten Hardware löschen. 

Bin zeitgleiches Einspeiehem, Vorrälighalten oder Benutzen auf mehr als nur einer Hardware ist unzulässig. 

(2) Der Einsatz der überlassenen Software innerhalb eines Netzwerkes oder eines sonstigen Mehrstations-Rechensy.stems 
ist unzulässig, sofern damit die Möglichkeit zeitgleicher Mehrfuchnulzung des Programms geschaffen wird. Möchte der 
Anwender die Software innerhalb eines Netzwerkes oder sonstiger Mehrstations-Rechensystemc einsetzen, muß er eine 
zeitgleiche Mchrlächnutzung durch Zugriffsschutzmechanismen unterbinden oder an den Lieferanten eine besondere 
Netzwerkgebuhr entrichten, deren Höhe sich nach der Anzahl der an das Rechensystem ange.schlossenen Benutzer 
bestimmt. 

(3) Die im Einzelfall zu entrichtende Netzwerkgebühr wird dem Anwender von dem Lielerant umgehend mitgeteilt. 
sobald der Anwender dem Lieferanleii den geplanten Netzwerkeinsatz, einschließlich der Anzahl angeschlossener 
Benutzer schriftlich bekanntgegeben hat. Unsere Anschrift ist dem Benutzerhandbuch zu entnehmen. Der Einsatz, iin 
Netzwerk isl erst nach der vollständigen Entrichtung der Netzwerkgebühr zulässig. 

4 Weiterveräullening 

(1) Der Anwender darf die Software einschließlich des Benutzerhandhuchs und des sonstigen Begleitmaterials auf Dauer 
an Dritte veräußern oder verschenken, vorausgesetzt, der erwerbende Drille erklärt sich mit der Weitergeltung der vorlie¬ 
genden Vertragsbedingungen dem Anwender gegenüber einverstanden. 

(2) Der Anwender muß die vorliegenden Vertragsbedingungen sorgtällig aufbewahren. Vor der Weitergabe der Sollware 
muß er sie dem neuen Anwender zur Kenntnisnahme vorlegen. Sollte der Anwender zum Zeitpunkt der Weitergabe die 
vorliegenden Vertragsbedingungen nicht mehr im Besitz, haben, ist er verplliehtet, ein Ersalzexemplar beim Hersteller 
anz.ufordem. Die entstehenden Versandkosten trägt der Anwender. 

(.3) Im Falle der Weitergabe muß der Anwender dem neuen Anwender .sämtliche Programmkopien einschließlich gege- 
benenlälls vorhandener Sicherheitskopien übergeben oder die nicht übergebenen Kopien vemiehten. Infolge der 
Weitergabe erlischt das Recht des allen .Anwenders zur Programmnutzung. 

Der Anwender ist verpflichtet, der Informationsptlichl nach 11 dieses Vertrages nachzukommen. 

5 Rekompilierung und Programmänderuiigeii 

(11 Die Rückübersetzung des überlassenen Programmcodes in andere Codeformen (Rekompilierung) sowie son.stige 
Arten der RUckerschließung der verschiedenen Hersiellungsstufen der Software iReverse-Engineering) einschließlich 
einer Progratnniänderung sind im privaten Bereich zulässig. 

(2) Die Entfernung eines Kopierschulz.es oder älmlicher Schulzrouiinen isl nur zulässig, sofern durch diesen 
Schuizmcchanismus die störungsfreie Pogruinmiiutzting hccinlrächligl oder verhindert wurde. Für die Beeinträchtigung 
oder Verhinderung störungsfreier Benutzbarkeit durch ilen Schulzmechanismus trägt der Anwender die Beweislast. 

|3) Die in den voranstehenden beiden Absälz.en angesprochenen Handlungen dürfen nur dann kommerziell arbeitenden 
Dritten überlassen werden, die mit dem Lieferanten in einem potentiellen Wetlbewerbsvcrhälinis stehen, wenn der 
Lieferant die gewünschten Programmänderungen nicht gegen ein angemessenes Entgelt vornehmen will. Der Anwender 
muß dem Lieferanten eine hinreichende Frist zur Prüfung der Auftragsübemahme einräumen. 

(4l Urherberrechlsvermerke, Seriennummern sowie sonstige der Prograinmidentilikalion dienende Merkmale dürfen auf 
keinen Fall enlfemt oder verändert werden. 

A Gewährleistung 

(1) Mängel der gelieferten Software einschließlich der Handbücher und sonstiger Unterlagen werden vom Lieferanten 
innerhalb der Gewährleistungsfrisl von sechs Monaten ab Lieferung nach entsprechender Mitteilung durch den 
Anwender behoben. Dies geschieht nach Wahl des Lieferanten durch kostenfreie Nachbesserung oder durch 
Ersatzlieferung in Fonn eines Updates. 



(2) Kann der Mangel nicht innerhalb angemessener Frist behoben werden, ixler ist die Nachbesserung oder 
Ersatzlieferung aus sonstigen Gründen als fehlgeschlagen anzusehen, kann der Anwender nach seiner Wald 
Herabsetzung der Vergütung (Minderung} (Kler Rückgängigmachung des Vertrages (Wandelung) verlangen. Von einem 
Fehlschlagen der Nachbesserung ixier der Ersalzlieferung ist erst auszugehen: wenn dem Lieferanien hinreichende 
Gelegenheit zur Nachbesserung oder Ersatzlieferung eingeiüumi w-urde. ohne daß der gewünschte Frtblg erzielt wurde: 
wenn die Nachbesserung oder FrsulzIieterung unmöglich ist; wenn sie vom I,.ieferanten verweigert oder unzumutbar ver¬ 
zögert wird; wenn begründete Zweitel hinsichtlich der hrlolgsaussichten bestehen; oder wenn eine Unzumutbarkeil aus 
sonstigen Gründen vorliegt. 

(3) Der Anwender weiß, daß nach dem heutigen Stand der Technik die Erstellung völlig fehlerfreier Software nicht mög¬ 
lich ist. 

7 IJrilersiiehung.s- und Kügeptlicht 

(I ) Der Anwender ist verpflichtet, die gelieferte Software auf offensiclitiichc Mängel, die einem durchsehnittüchen 
Kunden ohne weiteres auffallen, zu untersuchen. Offensichtliche Mängel, insbesondere das Fehlen von Üntenträgeni 
oder Handbüchern sowie erhehlichc. leicht sichtbare Beschädigungen iles Datenträgers, .sind heim Lieferanten innerhalb 
von zwei Wochen nach Lieferung schritllich zu rügen. Die Mängel, insbesondere die aufgeireienen Symptome, sind nacfi 
Kräften detailliert zu beschreiben. 

l2j Mängel, die nicht otfensichtlich sind, mii.ssen beim Lieferanten innerhalb von zwei WtK'hen nach dem Erkennen 
durch den Anw'ender gerügt werden. 

13) Bei Verletzung der L'nlersuchungs- und Rügepllicht gilt die S<iflware in Ansehung des betreffenden Mangels als 
gcnehinigl. 

8 Huftung 

(1) Für Schäden wegen Rechtsmiingeln und Fehlens zugesichener Eigenschaften haftet der Lieferant unbeschränkt. Die 
Haftung für anfängliches Unvermögen. Verzug und Unmöglichkeit wird auf das Fünffache des Überlassungsentgelt.s 
sowie auf solche Schäden begrenzt, mit deren Entstehung im Rahmen einer allgemeinen Software-Überlassung lypi- 
scherweise gerecliiiet werden muß. Im übrigen haflel der Lieferant nur für Vorsatz und grobe Fahrlässigkeit auch seiner 
gesetzlichen Vertreter und Eifüllungsgehilfen, sofern nicht eine Pllicht verlel/J wird, deren Einhaltung für die 
Erreichung des Vertragszwecks von besonderer Bedeutung ist iKardinalpnichl). 

Bei Verletzung der Kurdinalpflicht ist die Haflung.sbeschränkung für anfängliches Unvermögen entsprechend heranzu¬ 
ziehen. 

i 2) Der Lieferant haftet nicht für Schäden, die durch Fehlbenutzung der Rechenanlage oder durch mangelnde, 
regelmäßige Absicherung der Daten in Fomi von Sicherungskopien entstanden sind. 

9 Eigentunisvorbehalt 

(1) Der l.ieferant l>ehäit sich da.s Eigentum an der dem Anw'ender gelieferten Software bis zur vollständigen Bezahlung 
sämtlicher zum Zeitpunkt der Lieferung bestehender (xler später entstehender Fordeningen aus diesem 
Verlrag.sverhältnis vor; bei Bezahlung durch Scheck oder Wechsel bis zu deren Einlösung. 

(2) Bei verschuldeten Zahlungsrückständen des Anwenders gilt die Geltendmachung des Eigcntumsvorbehalls durch den 
Lieferanten nicht als Rücktritt vom Vertrag, es sei denn, der Lieferant teilt dies dem Anwender ausdrücklich mit. 

10 Trunsportschüden 

Der Anwender ist verptlichtei, eventuelle Transportschäden unverzüglich und .schriflhch dem Transporteur zu melden 
und dem Lieferanten eine Kopie des Schriltverkehi's zuzusehicken, denn alle Sendungen sind über den Lieferanten versi¬ 
chert. 

11 Inforniationspnichteii 

Der Anwender ist im Falle der Weitervcräiißcrung der Software veipflichtet, dem I .ieferanien den Namen und die voll¬ 
ständige Anschritt des Käufers schriftlich mit/uleiien. I3ie Adres.se des Lieferanten ist der vorderen Umsehlagseile der 
Benutzungsanleitung zu entnehmen. 

12 Sonstiges 

(1) In diesem Vertrag sind sämtliche Rechte und PHichlen der Vertragsparteien geregelt. Sonstige Vereinbarungen beste¬ 
hen nicht. Änderungen .sind nur in Schriftlörm und bei Bezugnahme auf diesen Vertrag wirksam und beiderseitig zu 
unterzeichnen. 

(2) Der Gerichtsstand für alle Streitigkeiten aus diesem Vertrag ist, soweit vereinbar, dies zuständige Gericht in Frankfurt 
am .Main. 

(3) Sollten ein7.elne Bestimmungen dieser Bedingungen nicht rcchlswirksam sein oder ihre Reehtswirksamkcil durch 
einen späteren Umstand verlieren, oder sollte sich in diesen Bedingungen eine Lücke herau.sstellen. so wird hierdurch die 
Rcchtsw'irksamkeit der übrigen Bestimmungen nicht berührt. Anstelle der unwirksamen Vertragsbestimmungen oder zur 
Ausfüllung der Lücke soll eine angeme.sscne Regelung gelten, die, soweit rechtlich möglich, dem am nächsten kommt, 
was die Vcrlragsparleien gew'olli haben, soweit sie von der Unwirksamkeit der Bestimmung Kenntnis gehabt hätten. 



MaxonPASCAl. 


5 


Inhalt _ 

1. Vorwort zur Version 3. 17 

2. Die integrierte Entwicklungsumgebung. 22 

3. Der Spezialist für viel Tipparbeit. 42 

4. Syntax.85 

5. Die Datentypen von MaxonPASCAL. 113 

6. Variablen und Konstanten. 145 

7. Prozeduren und Funktionen. 147 

8. Compiler-Anweisungen und Includefiies. 175 

9. Units und Module.191 

10. MAKE - die integrierte Projektverwaltung. 219 

11. Standard-Units. 235 

Anhang. 249 

Index 


,307 
















MaxonPASCAl. 


7 


Inhaltsverzeichnis _ 

1. Vorwort zur Version 3 

1.2.1 Disketten.18 

1.2.2 Installation.18 

1.2.3 Die Komponenten des MaxonPASCAL Systems.18 

1.3 Erste Schritte mit MaxonPASCAL.20 

2. Die integrierte Entwicklungsumgebung 

2.1 Programmstart und Optionen..22 

2.2 Compiler und Editor.23 

2.3 Das Konzept.24 

2.4 Compiler-Funktionen.....25 

2.4.1 Programme übersetzen.25 

2.4.1.1 Das Compiler-Fenster .25 

2.4.1.2 Abbruch und Ausstieg .27 

2.4.1.3 Auswahl von Fehlermeldungen .27 

2.4.1.4 Vom Compiler in den Editor .27 

2.4.1.5 „Weiter" .28 

2.4.1.6 Programmstart aus dem Compiler-Fenster .28 

2.4.1.7 Erneutes öffnen des Compilerfensters . 28 

2.4.2 Ausführen und Abbrechen.29 

2.4.3 Exe- und Dbjektdateien.29 

2.4.4 Daten und Informationen.30 

2.5 Features und Optionen.30 

2.5.1 Ein kurzer Überblick.30 

2.5.2 Der Compiler-Requester.30 

2.5.2.1 Die Flauptdatei .30 

2.5.2.2 Pfade für Include-Dateien und Units .31 

2.5.2.3 Eine „Llnl(er“-Einstellung .31 

2.5.2.4 Units im Make-Modus .31 

2.5.2.5 Arbeitsspeicher .32 

2.5.2.6 Diverse Compiler-Schalter. .32 

2.5.2.7 Automatisches Erzeugen von Dateien .33 

2.5.3 MaxonPASCAL-Systemeinstellungen.33 

2.5.3.1 Erzeugen von icons .33 

2.5.3.2 Abhängigkeiten in Make-Dateien .33 



































MaxonPASCAL 


8 


2.5.3.3 Protokollieren von Ein- und Ausgaben . 34 

2.5.3.4 Argumente aus der imaginären Kommandozeile .34 

2.5.3.5 Einbindung des Maxon Assemblers . 34 

2.5.3.6 Debugger . 34 

2.5.3.7 Stackgröße. . 35 

2.5.3.8 Autosave . 35 

2.5.3.9 Dateiauswahlbox . 35 

2.5.4 Abspeichern der Konfigurationsdatei. 35 

2.5.4.1 Allgemeines . 35 

2.5.4.2 Der Editor . 36 

2.5.4.3 Fensterdaten .36 

2.5.4.4 Switches und Schalter .36 

2.5.4.5 Stringoptionen .36 

2.5.4.6 Compiler-Einstellungen . 37 

2.6 Die ARexx-Schnittstelle.37 

2.6.1 Grundlagen. 37 

2.6.2 Der ARexx-Port. 38 

2.6.3 Die ARexx-Befehle. 39 

2.6.3.1 Schließen, öffnen und Beenden . 39 

2.6.3.2 Übersetzen, Starten und Ähnliches . 39 

2.6.3.3 Requester und Informationen . 39 

2.6.3.4 Make . 39 

2.6.3.5 Schreiben von Dateien .40 

2.6.3.6 Optionen speichern und setzen . 40 

2.6.3.7 Informationen über die Entwicklungsumgebung . 40 

2.6.3.8 Fehlermeldungen und Fehlerstellenansprung .41 

3. Der Spezialist für viel Tipparbeit 

3.1 Installation von Edward auf der Festplatte.42 

3.2 Aufruf von Edward.42 

3.2.1 Start von der Workbench. 42 

3.1.2 Start aus dem CLI. 43 

3.2 Eingabe und Bearbeitung von Texten.43 

3.2.1 Die Status-Anzeige. 43 

3.2.2 BACKSP3ACE und DELETE. 44 

3.2.3 UndoLine-Funktion. 44 

3.2.4. RETURN, ENTER und TAB. 44 

3.2.5 Die Cursor-Tasten und der Ziffernblock. 45 

3.2.6 Der Schieberegler. 45 








































MaxonPASCAL 


9 


3.2.7 Die Maus.45 

3.3 Text.46 

3.3.1 Erzeugen von Texten.46 

3.3.2 Wahl eines bestimmten Textes. 46 

3.3.3 Freigeben eines Textes.47 

3.3.4 Löschen des aktuellen Textes.47 

3.3.5 Drucken eines Textes.47 

3.4 Dateioperationen.48 

3.4.1 Speichern von Texten.48 

3.4.2 Laden von Texten.49 

3.5. Blockoperationen.49 

3.5.1 Cut, Copy, Paste.49 

3.5.2 Spaltenbiöcke.51 

3.5.3 Laden, Speichern und Drucken.51 

3.5.4 Einrücken.52 

3.5.5 Umwandeln in Groß- bzw. Kleinbuchstaben.52 

3.6 Suchen und Ersetzen.53 

3.6.1 Das „Find“-Formular.53 

3.6.2. Das „Find & Replace“-Formuiar.54 

3.6.3 Struktur-Check (Klammer-Check).55 

3.6.4 Compiler Error-Datei interpretieren, Fehler anspringen.56 

3.6.5 Auf bestimmte Zeilen positionieren.57 

3.7 Strukturieren von Texten, Lesezeichen.57 

3.7.1Erzeuge Falte.57 

3.7.2 Auszeichnen von Zeilen.60 

3.7.3 Cursor-Bewegung.60 

3.7.4 Lesezeichen (Bookmarks).60 

3.9 „Word-Wrap“.62 

3.10 Makros.63 

3.10.1 Makros aufzeichnen & abspielen.63 

3.10.2 Makros speichern & abspielen.64 

3.11 Fenster.65 

3.11.1 Erzeugen von Fenstern.65 

3.11.2 Wahl eines bestimmten Fensters.66 

3.11.3 Schließen von Fenstern.66 

3.11.4 Arbeiten mit mehreren Ansichten eines Textes.67 






































MaxonPASCAL 


10 


3.12 Verlassen des Editors. 68 

3.12.1. Unterbrechen der Arbeit. 68 

3.12.2 Verlassen des Editors.69 

3.13 Iconify & HotKey.69 

3.13.1 Iconify.69 

3.13.2 HotKey.69 

4.14 Der Kommandozeilen-Interpreter.70 

3.15 Globale Einstellungen.70 

3.15.1 Das „Globale Einstellungen“-Formular.70 

3.15.2 Das „Seitenforniat“-Formular. 74 

3.16 Benutzerdefinierte Menüs, Tastenbelegung. 75 

3.16.1 Kurze Einführung in die EBNF-Darstellung.76 

3.16.2 Definition eigener Menüs. 77 

3.16.3 Definition der Tastaturbelegung.78 

3.16.4 Definition des HotKeys.80 

3.16.5 Einladen einer neuen Definition.81 

3.17 ARexx - Kommunikation mit Edward.81 

3.18 Zurücknehmen von Text-Änderungen.82 

4. Syntax 

4.1 Allgemeines.85 

4.1.1 Syntaktische Notation.85 

4.1.2 Symbole.87 

4.1.3 Das Semikolon - das ungeliebte Trennzeichen. 88 

4.1.4 Kommentare. 88 

4.1.5 Bezeichner. 88 

4.2 Programmkopf.89 

4.3 Blöcke.89 

4.4 Label.90 

4.5 Konstanten und Konstantendefinition.90 

4.6 Typdefinition.91 

4.7 Variablendeklaration.92 

4.8 Prozeduren und Funktionen.93 

4.8.1 Allgemeines über Prozeduren.93 


































MaxonPASCAL 


11 


4.8.2 Parameter.97 

4.8.2.1 Wert-Parameter .97 

4.8.2.2 Variablenparameter .98 

4.8.3 Funktionen.191 

4.8.4 Prozedurparameter und andere Spezialitäten.102 

4.8.5 Zusammentassend: Syntax.104 

4.9 Anweisungsteil.194 

4.9.1 Wertzuweisung.195 

4.9.2 Prozeduraufruf.195 

4.9.3 Verbundanweisung.196 

4.9.4 Falluntersctieidung.106 

4.9.5 HEPEAT-Schleife.197 

4.9.6 WHILE-Schleife.197 

4.9.7 FOR-Schleife.197 

4.9.8 CASE-Anweisung.198 

4.9.9 WITH-Anweisung.119 

4.9.10 GOTO-Sprünge.111 

5. Die Datentypen von MaxonPASCAL 

5.1 Numerische Typen.113 

5.1.1 Ganzzahl-Typen.113 

5.1.2 Gleitpunktzahlen.117 

5.2 Boolean.120 

5.3Char.121 

5.4 Aufzählungs- und Ausschnittstypen.121 

5.5 Stringtypen.123 

5.6 Pointertypen.128 

5.7 SET^iypen.129 

5.8 Strukturierte Datentypen: Arrays und Records.130 

5.9 Typkonvertierungen.136 

5.10 Literale für Records und Arrays.139 

5.11 Dateitypen.142 

6. Variablen und Konstanten 
































MaxonPASCAL 


12 


6.1 Standard-Variablen.145 

6.2 Vordefinierte Konstanten. 146 


7. Prozeduren und Funktionen 

7.1 Ein- und Ausgabe. 147 

7.2 Dateien.. 

7.3 Arithmetische und andere Funktionen. 157 

7.4 Pointer.. 

7.5 AMIGA-Spezifisches.160 

7.6 Nützliche MaxonPASCAL-Spezialitäten. 164 

7.7 Stringbehandlung. 171 



8. Compiler-Anweisungen und Includefiles 


8.1 Compiler Directives. 175 

8.1.1 Includefiles. 175 

8.1.2 Bedingte Compilierung. 177 

8.1.3 Error. 173 

8.1.4 Linkersteuerung. 179 

8.1.5 Compiler-Optionen. 179 

t-Suhrange testen. 180 

i - Indexbereich bei Array-Zugrift.181 

b - Unterbrechen. 181 

s - Stacküberlauf abfangen.182 

a - Überlauf bei aritbmetischen Operationen melden.182 

8.1.6 Kurzauswertung boolescher Ausdrücke.183 

8.1.7 Behandlung von Ein-/Ausgabefehlern.185 

8.2 Libraries.186 

8.3 Anmerkungen zu den Include-Files.188 




9. Units und Module 

9.1 Modulare Programmierung: was, warum und wie?.191 

9.2 Syntax von Modulen. 192 

9.3 Objektdateien und Linkersteuerung. 194 





























MaxonPASCAI. 


13 


9.4 Alink-Kompatiblität - Fluch und Segen.196 

9.5 Hunks. 

9.6 Dynamische und statische Variablen.198 

9.7 Externes und internes Linken mit „PasLib.o“.199 

9.8 Units.201 

9.8.1 Ein erstes Beispiel.201 

9.8.2 USES.203 

9.9 Units - Alles noch ‘mal etwas genauer..203 

9.9.1 Syntax.203 

9.9.2 Units und Module.205 

9.9.3 Schachtelung von USES-Aufrufen.206 

9.10 Bezeichner-Handhabung in Units.207 

9.11 Initialisierung und andere Spezialitäten..209 

9.11.1 Initialisierungs-Prozeduren.209 

9.11.2 Prüfsummen.210 

9.12 Projekte - Modulares Programmieren mit Units.212 

9.12.1 Aufräumen im Unit-Verzeichnis.212 

9.12.2 Organisation von Projekten.213 

9.13 Assembler und PASCAL.215 

10. MAKE - die integrierte Projektverwaltung 

10.1 Das Prinzip.219 

10.1.1 Wozu eine Projektverwaltung?.219 

10.1.2 Was ist das überhaupt - ein Projekt?.219 

10.1.3 Was hat das ganze mit „Make“ zu tun?.220 

10.2 Die Praxis.221 

10.2.1 Erstellen von Projekten.221 

10.2.2 Hinzufügen von Dateien, umständliche Methode.223 

10.2.3 Übersetzen des Projekts.224 

10.2.4 Hinzufügen von Dateien, einfache Methode.224 

10.2.5 Abhängigkeiten.225 

10.2.6 Weitere Funktionen im Make-Fenster.226 

10.2.6.1 Projektpflege .226 

10.2.6.2 Übersetzung erzwingen .226 

10.2.6.3 Dateien in den Editor laden .226 




































MaxonPASCAL 


14 


10.2.6.4 Projektdatei wechseln .227 

10.2.7 Compileranweisungen für Objektdateien.227 

10.2.7.11nterne Übersetzung .227 

10.3 Handgemachte Makedateien.228 

10.3.1 Die Grundlagen.228 

10.3.2 Der Linkeraufruf.228 

10.3.3 Internes Compilieren.229 

10.3.4 Exferne Übersetzung.230 

10.3.5 Weitere Features.230 

10.3.5.1 Zeilenverbindung .230 

10.3.5.2 Kommentare...., .231 

10.3.5.3 Makros .231 

10.3.5.4 Regeln .232 

11. Standard-Units 

11.1 Crt und PASCALCrt.235 

11.2 Printer.242 

11.3 Die AMIGA-System-Units.242 

11.3.1 Execl und Exec.243 

11.3.2 GraphTypes und Graphics.243 

11.3.3 Intuition.244 

11.3.4 Custom.244 

11.4 ExecSupport und ExeclO.245 

Anhang 

A) Compiler-Fehlermeldungen.249 

B) Laufzeitfehler.257 

D) Die Kommandos des Editors.259 

D-1 Eingabe und Bearbeitung von Texten.260 

D-2 Verwalten von Texten.264 

D-3 Dateioperationen.266 

D-4 Blockoperationen.267 

D-5 Suchen und Ersetzen.270 

D-6 Strukturieren von Texten.272 

D-7 Ändern von Optionen für den aktuellen Text.275 

D-8 Word-Wrap.276 

D-9 Makros.277 




































Maxonl'ASCAL 


15 


D-10 Fenster.278 

D-11 Verlassen des Editors.279 

D-12 Formulare.280 

D-13 Der Kommandozeilen-Interpreter.281 

D-14 Ändern von globalen Einstellungen.282 

D-15 ARexx - Kommunikation mit Edward.284 

D-15.1 Abfrage von Statuswerten Edwards. .284 

D-15.2 Laden von Texten aus Edward heraus .287 

D-16 UnDo/ReDo - Zurücknehmen von Textänderungen.288 

D-17 Verschiedenes.289 

E) Editor-Fehlermeldungen.290 

E-1 Informationen.290 

E-2 Allgemeine Fehlermeldungen.290 

E-3 Fehlermeldungen mit Abfragen.294 

E-4 Meldungen mit Abfragen.294 

E-5 Fehler bei Betriebssystemoperationen.296 

E-6 Eingabefehler.297 

E-7 Fehler in den Definitionsdateien.298 

E-8 Fehler beim Analysieren von Kommandos.300 

E-9 Fehlermeldungen beim Auswerten von Kommandos.301 

F) Kurzübersicht.302 

1. ) Wort-Symbole (reserviert Pascal-Schlüsselwörter):.302 

2. ) Direktiven:.302 

3. ) Konstanten.303 

4. ) Typhezeichner.303 

5. ) Variablen.304 

6. ) Prozeduren.304 

7. ) Funktionen.305 

Index.307 

































1. MaxonPASCAL 


17 


1. Vorwort zur Version 3 


Seit mehr als fünf Jahren cs schon das Ix-kanntc und erfolgreiche Amiga-Pascalsystem 
„KickPascal“. Nach einer längeren Pause liegt jetzt wieder eine neue Version vor. Der 
Generationswechsel drückt sich diesmal nicht nur durch eine neue Versionsnummer, sondern auch 
durch einen neuen Namen aus - „MaxonPASCAL 3“. 

Der Ct.impiler ist in seinem Kern größtenteils unverändert geblieben, so daß die Kompatiblität zwi- 
.schen KickPascal 2 und MaxonPa.sr'al 3 auf jeden Fall gewährleistet ist, 

Neues Herzstück des Systems ist der komfortable Editor „Edward“, der sich schon seit einiger Zeit 
im MaxonC^'^-System bewährt hat und übrigens auch separat erworben werden kann. Durch Menüs 
und Tastenkombinationen - dies kann vollkommen frei konfiguriert und Ihren Bedürfni.ssen 
angepaßt werden - wird der Compiler direkt aus dem Editor angesteuert. Einstellungen aller Art 
werden jetzt über Dialogfenster vorgenommen. Auch stinst arbeitet das System jetzt mit wesentlich 
mehr Fenstern, was den Komfort und die L.'bersichtlichkeit steigert. 

Die Entwicklung umfangreicher Projekte wird von MaxonPASC.Al, jetzt tesser unterstützt. In die 
Oberfiäche wurde ein leistungsfähiges utid doch leicht bedienbares „Make“ integriert, das die Üter- 
setzung von Modulen automatisiert. Das Modulkonzept ties Compilers wurde zugleich ein wenig 
erweitert, so daß man jetzt, kurz gesagt, globale Funktionen wie in C oder C^* in „Header-Files“ 
deklarieren kann. 

Von den zahlreichen Neuerungen an der Benutzerschnittstelle soll an dieser Stelle nur noch die 
ARexx-Fähigkeit erwähnt werden. Der Editor besitzt einen i\Rexx-Port, über den er „ferngesteuert“ 
wertlen kann, und auf diesen Weg kann natürlich auch der Compiler aufgerufen w'erden. Sie kön¬ 
nen den Compiler aber auch separat, d. h. ganz ohne Editor, starten. Der richtet dann einen eige¬ 
nen ARexx-Port ein und wartet auf dort eingehende Anweisungen. Auf diese Weise können Sie den 
MaxonP.ASC\L-Compiler über ARexx-Scripte in beliebige andere Systeme integrieren und so z. B. 
einen anderen Editor einbinden. 

Zu guter letzt soll nicht vergessen werden, daß die Units und Includes w'ieder einmal an neue 
Betriebssystemversionen angepaßt wurden, AI) sofort gehören die Systemdateien für Version 3.0 
zum Liefemmfang. Selbstverständlich werden wir auch in Zukunft mit der Weiterentwicklung des 
Amiga-Systems Schritt halten und alle neuen Amiga-Systemincludes für MaxonPASCAL anpassen. 



MaxonPASCAL 


18 


1.2 Ein erster Überblick 
1.2.1 Disketten 

MaxonPASCAL wird auf muhreren Disketten ohne Kopiersehiitz geliefert. Weitere aktuelle Angaben 
finden Sie in der „ReadMe'‘-Datei auf der ersten Diskette. Diese Datei sollten Sie auf jeden Fall als 
erstes lesen. 


1.2.2 Installation 

Um das System auf Ihrer Festplatte zu installieren, sollten Sie sich zuerst ein geeignetes Verzeichnis 
anlegegen, z. B. „WORKcMaxonPASCAL". 

Nun starten Sie einfach das Installationsprogramm von der ersten Diskette. Damit können Sie das 
System natürlich wahlweise auch auf Disketten installieren. 


1.2.3 Die Komponenten des MaxonPASCAL Systems 

ln diesem ,\lrschnitt sollen die wichtigsten Dateien des MaxonP.'VSCAl. Systems ktirz erläutert wer¬ 
den. Das soll Ihnen helfen, sich mit den zahlreichen Dateien und Verzeichnissen besser z.urechtzu- 
finden. 

Bei der Installation wird ein logisches Gerät „P.ASC.\L;‘‘ dem Verzeichnis, in das Sie die Installation 
tlurchgeluhrt haben, zugewiesen. Darin befindet sich ein Unterverzeichnis „Bin", in dem die mei¬ 
sten ausfühiharen Dateien stehen. 

“MRASCAL“ ist die integrierte Entwicklungsumgebung. Wenn die Installation korrekt und erfolgreich 
abgelaufen ist, können Sie einfach einmal versuchen, tlieses Programm zu starten. 

MPASCAl, enthält das komplette Entwicklungssystem einschließlich Compiler und Projektver¬ 
waltung - nur der Editor muß noch dazugeladen wertlen. 'X'ahrend der Installation wird der Editor 
..Edward" in ein Verzeichnis „Edward;" abgelegt. MPASC.AI. lädt ihn von dort automatisch nach. Sie 
können Edward aber auch allein ohne Compiler aufrufen. 

Edw'ard benötigt unbedingt eine Datei „Edward:Edward.DEF“, in der die Menü- und Tastenbelegung 
der Entwicklungsumgebung abgespeichett ist. Diese Datei wird bei der Installation automatisch 
erzeugt. Im Edward-Handbuch finden Sie eine ausführliche Anleitung, wie Sie diese Datei ändern 
können, um das .MaxonPASCAI.-System nach Ihren persönlichen Vorstellungen und Wünschen zu 
konfigurieren. 

Sow'ohl MPASCAL als auch Edward benötigen die ..rct.libnirv'". Die.se sollte während der Installation 
in Ihr „Dbs:“-Verzeichnis kopiert worden sein. 

Neben einigen nützlicheti anderen Funktionen erleichtert die „rct.library“ insbesondere die 
Programmierung von Benutzerschnittstellen, die mit dem Oberflächengenerator „MakeAPP“ erzeugt 
w'urden. Ein solches Programm benötigt dann aber nicht nur diese Libran', sondern auch eine 


1. MaxonPASCAL 


19 


„.RCT'-Daiei, in der die eigentliche Oberfläche abgespeichert ist. Für MPASCAL lieißt diese Datei 
„MP.'\SCAL.RCT" und wird ini Vereeichnis „PASCA].:Din“ erwartet, w'älirend die Edward-Oberfläche in 
„EdwardRes.RCT' im Vereeichnis „Edward:“ abgespeichert ist, 

L'm MPASCM. zu starten, müssen also folgende Dateien installiert sein und im richtigen Verzeichnis 
liegen: 

- PASC.AL:llin/MPASCAL 

- PASCAL:Bin/MPASCAL.RCT 

- ED\X'ARD:Edward 

- ED«'ARD:Edward.DEF 

- EDW,\RD:MP.ASC.AI3.DEF 

- EDWARD:EdwardRes.RCT 

- LIBS:rct.library' 

In der Entw'icklungsumgcbung können Sie über Requestcr und dergleichen eine ganze Menge 
Einstellungen vornehmen. Damit Sie das nicht bei jedem Start des Swiems wiederholen müssen, 
können Sie die Einstellungen natürlich auch abspeichern, und zwar in zwei Dateien im Verzeichnis 
„S:“: 

- „S:Edward.CONF“ Rir Editor-Eiastelltingen, 

- ,,S:MPASCAL.config“ für Compiler-Optionen. 

Auch diese beiden Dateien werden bei der Installation automaüsch angelegt. Wenn Sie fehlen, 
macht das aber nichts, da sowohl .MPASCAL als auch Edward sinnvolle Default-Werte besitzen. 

Vorzugsweise sucht das M;ixonP,ASCAL-System ohnehin nicht nach den Dateien im „S:“-Verzeichnis, 
sondern versucht nach Möglichkeit, aus dem aktuellen Verzeichnis folgende Dateien zu lesen: 

- „Edward.SESSION“ für Editor-Einstellungen, 

- „MP-ASCAl,.SESSION“ für Compiler-Optionen, 

Diese beiden Dateien enthalten nicht nur .sämtliche Einstellungen und Optionen, sondern auch 
Informationen darüber, welche Texte geladen und welche Fenster an welchen Positionen geöffnet 
sind. Die ,.Session“-Dateien werden aber nicht bei der Installation erzeugt, sondern auf Verlangen 
von MPACAl, bzw. Edward selbst ins aktuelle Verzeichnis geschrieben. 

Ferner sollte nach erfolgreicher Installation auch irgendwo ein Verzeichnis namens „HOTHELP:“ exi¬ 
stieren, in dem alle Dateien und Verzeichnisse liegen, die zum Ünline-Hilfesystem „Hotllelp" 
gehören. 

Um sinnvoll mit MaxonP.ASCAL arbeiten zu können, benötigen Sie auch Units und Includc-Dateien. 
Die Standard-Units befinden sich normalerweise im Verzeichnis „PASCAL:UNITS‘‘, während in „PAS- 
CAL:Include“ sowohl die Standard-lncludes von MaxonPASCAL als auch die jeweils aktuellsten 
Amiga-OS-lncludes von Commodore liegen. Wenn Sie diese Pfadnamen ändern wollen, sollten Sie 
wissen, w'as sie tun, und dieses Benut/.erhandbuch aufmerksam gelesen haben. 



Maxonl’ASCAL 


2ü 


1.3 Erste Schritte mit MaxonPASCAL 

Die integrierte Entwickiiingstinigebiing „MPASCAL“ kann wahlweise von der Worklrench nder vom 
CI.I aus gestartet werden. Dabei besitzt das Programm keine eigene Benutzcroberiladie, sontlern 
lädt den Editor „Edward“ nadi. Eolglidi mtiß dieser Editor korrekt installiert sein. Wird der Etlitor 
nicht gefunden, startet iVlaxonP/VSCAI. nicht und giiit eine entsprechende Nachricht aus. 

Nach dem Start lantien Sie automatisch im Editor, liier können Sie llire PASCA1.-Pr()gramme schrei¬ 
ben und bearbeiten. Dem Etlitor „Edward“ ist ein separates l landimch gewidmet, deshalb soll bier 
nicht nälier auf die Editor-Funktionen eingegangen werden. 


3MQ/AriatyMioril/AnjiyiMS p 


m I 

. yül j rt feyfwttori.: 


MaxonPASCAL 


I —. . .■ 

Projekt 15 Makeflie 
Kein Proor'-Mw ubersatzt 


Jß!L 


vrifceP (’ j 

■TifcaP('3.iri.''>;'• 
rlfeeP(■tan'); 
ritffPragn'); 
rJ.teP('accco9') 
titeP('ai:ccot’) 
atcalri’) 
riteP('atetan’> 


pt; intägec). 

lege.rj 

1 Then 
t Ot 


lE3|t^ 


SKPORT; 


Vj g I fnfb_ 


1 rr* 

iL 


Itgal 


HRXON CDHfIRO 
Rutor: Thonas £. 14 i« 9 »r 
Version f-2 

GberflVch« oenerlert «It R.C.T. 
<e> nsKoo C«Rput:»r 6nbM ^92 


Tunktion: Bogin 


Begin 

vKiteP (D-' nam«) i If b'' naiÄe*»'?' Tban 
Bndi 
Begln 

aptppi:i,(b), 

If ap<pr Thaxv vritePC'('5; 
rnPl?c<h'', opl, ap>; 

vrit«PCb'- naiie); InPix(b'', op2, ap + l>. 
If ap<pr Than vriteP<'>') 

Begin ifritePR<b'- vaiue.Q)j Vcit«P(* ') e 


oj ProjectMartayr ; _ 

1 t/PÖW/NnWVysalorll/ftrisXi (3 

mmmmmiammmmm 


i©i! 


421/ 42» efwoi 
253/ 253 ofwoC 


/Viti besten machen Sie sich jetzt ein wenig mit tlem Editor vertraut, indem Sie ein kleines Programm 
sclirciben. Sie könnten z, B. folgendes Linvermcidliche und traditionsreiche Progrämmchen einge¬ 
ben: 

PROGRAM Hello; 

BEGIN 

writeln{'Hello World!') 

END. 


Ntin haben Sie ein Progranuii als Quelltext vorliegen und können den Compiler ausprohieren. 
Zuerst sollten Sie den Text abs|reicliern, um ihm so einen sinnvollen Namen zu geben, mit dem der 
Com|riler atieh etwas anfangen kann. Dann wählen Sie einfach den Menüpunkt „übersetzen“ aus 
der Menüleiste tind warten ab, wsis geschieht. 






1. MaxonPASCAI. 


21 


Es üffnci sich ein Fenster, in tiem MaxoiiPASC.M. gegelx-nenfalLs Fehlermeldungen oder Warnungen 
ausgibt. Tritt ein Fehler auf, wird er in diesem Fenster gemeldet und der entsprechende 
Quelltextbereich angezeigt. Sie können dann eine Fehlermeldung anwählen und mit den Gadgets 
„Anspringen“ und „ln Editor“ direkt die entsprechende Textstelle im Editor anspringen. 

Wenn das System korrekt installiert wurde und ihr Programm ebenfalls fehlerlos ist, sollte das 
Fenster aber ebenso schnell verschwintlen, wie es aufgetaucht ist. Nun können Sic die .Menü- 
Funktion „Ausfuhren“ anwählen und das Programm starten. Auch dabei öffnet sich ein Fenster, in 
dem (wer hätte das gedacht!) „Hello, World!“ ausgegeben wird. AiilSerdem werden Sie freundlich 
aufgefortleri, die <Return>-Taste zu drücken, denn sinnvollerw'eise schließt MP.ASC.AL das Fenster 
nicht, bevor Sie Gelegenheit hatten, tlie Ausgabe zu lesen. 

Sie können das Programm natürlich nttch einmal starten. Falls Sie seit der letzten Übersetzung etwas 
am Quelltext verändert haben, wirtl der Cotnpiler automatisch neu gestartet. 



MaxonPASCAL 


22 


2. Die integrierte Entwicklungsumgebung 

2.1 Programmstart und Optionen 

Wenn Sie MPASCAI. vom CU bzw. aus einer Shell starten, können Sie optional einige Parameter 
angeben. Als erstes können Sic einen Dateinamen angehen, z. B. 

run MPASCAL Demos:prg/hello.p 

Sofern die angegebene Datei existiert und lesbar ist, wird sie in den Editor geladen. Da der Edward 
mehrere Texte verxvalten kann, können Sie natürlich auch mehrere Dateinamen angehen. 

Wenn Sie eine andere Konfigurationsdatei als „SiMPAC.AL.conl'ig“ benutzen wollen, können sie ein 
zusätzliches Argument mit vorangestelltem „-c“ angehen. 

Ein Beispiel: run MPASCAL teet.c -c PASCAL: spezial, config 

Zwischen „-c" und dem Dateinamen darf auch ein Leerzeichen stehen. 

MaxonP.ASCAL besitzt eine integrierte Projektverwaltung, allgemein bekannt als „Make“. Sie können 
gleich Iteim Programmstan eine solche Make-Datei öffnen, und zwar mit der Option „-m“: 

run MPASCAL -m plot.makefile. 

Natürlich lassen sich diese Optionen und Argumente in beliebiger Reihenfolge kombinieren, z. B. 

MPASCAL fclass.p -m wagga.makefile -c d£l:s/MPASCAL.config. 

Seit Version 3.0 besitzt MaxonPASCAL einen eigenen ARexx-Port. Wenn Sie als einziges Argument 
r“ angeben, also z. B. run MRASCAI. -r startet MaxonPASCAL im .ARexx-Modus. Dabei wird Edward 
nicht geladen. Statt dessen wird ein ARexx-Port namens ,.MAXONPASCAI.“ eingerichtet, mit dem das 
System über ein ARexx-Script gestetiert werden ktinn. Auch für das Nachladen des Editors und die 
Kommunikation zwischen den beiden Programmen müssen Sie dann (über geeignete ARexx- 
Programme) selbst sorgen. So können Sie einen beliebigen - cxler auch überhaupt keinen - Editor in 
die Umgebung einbinden. 

Hinter der Option „-r“ kann optional ncjch ein Portname angegeben werden, z. B. „run .MPASCAL -r 
Wagga“. 

In diesem Fall wird der .ARexx-Port nicht „.M.AXONPASCAL", sondern „WAGGA“ genannt. Man beach¬ 
te, daK der Portname in Großbuchstaben umgewandelt wird. In jedem Fall aber gilt, daß 
.MaxonPASCAL für eindeutige Portnamen sorgt. Falls z. B. schon ein Port „MAXONP.ASC.AI.“ existiert, 
werden so lange „.MAXONPASCAiJ“, „MAXONPASC.A12“, MAXONPASCAL3“ usw. ausprobiert, bis ein 
Name gefunden wird, den es im ganzen .System noch nicht gibt. 

Alles weitere über den ARexx-Port und was Sie damit anfangen können entnehmen Sie bitte 
Abschnitt x.y. 


2. Maxon PASCAL 


23 


2.2 Compiler und Editor - eine harmonische Beziehungskiste 

Wie oben schon ajigecleutet, ist der Etlitor „Edward“ ein eigenständiges Programm, das auch ohne 
den Compiler benutzt werden kann. MaxonPjCSCAI. lätlt ilin einfach nach und startet ihn als zweiten 
Prozess, läEt aber keinen Zweifel daran aufkommen, daE er der BoE ist. 

Weniger blumig ausgedriiekt, richtet MaxonPASCAL einen Port ein, über den sich Editor und 
Compiler Nachrichten zuschicken. Wirtl im Edward vom Benutzer eine Compiler-Funktion aufgeru¬ 
fen, etwa durch eines der Ptill-Down-Menüs «ier eine entsprechend belegte Tastenkombination, 
läEt Etlward dem Compiler eine entsprechende Nachricht zukommen. 

Ich erzähle ihnen diese gattzen implementatorischen Details, damit Sie verstehen können, wie Sie 
sich das MaxonPASCAl.-System selbst kontigurieren können. Der Schlüssel dazu ist die „.DEF''-Datei 
des Edward. Hier werden alle Menüs und Tastenbelegtmgen des Editors abgelegt, und hier muß 
irgendwie tlie Benutzerschnittstelle des Compilers integriert werden, auch wenn der Editor nicht 
die geringste Ahnug hat, was ein Compiler ist und wozu er gut ist. 

Deshtilb hat der Edward eine Spezial-Funktion namens „Sendi\l)pComm'\ die als Argument wieder¬ 
um eine Compiler-Funktion erw'aitet. Beispielsweise gibt es eine MttxonPASCAL-Anweisung namens 
„compik“. W'ird nun vom Benutzer, also Ihnen, im Etlward ein Menü au.sgewählt, das mit der 
Funktion ‘SendAppComm „compik'“ belegt ist, schickt Edward das „compile“ als Nachricht an 
MP.ASCAl. und kümmert sich tiann nicht weiter drum. MtixonPASCAL dagegen erhält diese 
Anweisung, fordert vom Edward noch ein paar zusätzliche Daten an und beginnt dann freudig tnit 
der Übersetzung. Natürlich kann man nicht nur ein Menü, sondern auch eine Taste oder 
Tastenkombinaiion mit diesen „.S'mMppC’o»»»''-Anweistingen belegen. 

Auf diese Weise sind tier Compiler und der Editor vollkommen voneinander abgekoppelt, und 
Edward braucht nichts über MPASCAl, zu wissen. Nun kommt es natürlich vor, daß Sie tlen Edward 
einmal „einfach .so“ ohne Compiler benutzen wollen. Deshalb läßt Edward einen kleinen 
„Preprozessor“ auf das „.DEF-‘-File Icjs und filtert je nach Modus Teile aus dem Text aus - ähnlich wie 
ein C-Preprozessor bei „#ifdei’‘-Zeilen. Auch dieses Feature ist in ihrem Edward-Handbuch 
beschrieben. MPASCAL teilt dem Edward mit, tlaß ein Symbol namens „MPASCA13“ definiert sein 
soll. Nun können Sie Dinge wie .,#ifdef MP.ASCAI,3“ in Ihre DEF-Datei schreiben, um Definitionen 
je nach Modus ein- oder auszublenden. Insbesondere werden Sie sich um sämtliche Menü- 
Definitionen des Compilers eine „#ifdef MP,ASCAL3 ... #endif‘-Klammer legen wollen, wie es auch 
in der mitgelieferten Staiulard-Datei der Fall ist. 

langer Rede kurzer Sinn: Wenn im folgenden von irgendwelchen Menüs die Rede ist, werden dabei 
jetlesmal Hinweise wie „...oder wie auch immer Sie diese Funktion konfiguriert haben“ unterschla¬ 
ge. Gemeint ist damit jeweils immer die Funktion, die in der Standard-Konfiguration auf dem ent¬ 
sprechenden Menü liegt. 



MaxonPASCAL 


24 


Es gibt übrigens standardmäßig fttigende Menüs, mit den naciisteiiend angegebenen Compiier- 
Funktionsnamen: 

* Compiler 

- Übersetzen eompiic 

- Compiie Datei eompfiie 

- Ausfuhren run 

- Aitbreciien break 

- Exe-Datei exefiie 

- Objektciatei nbjectfiie 

- Informatiün info 

- Fehiermeidungcn errors 

* Make 

■ Projektveixvaitung make 

- Neues Makefiie newmk 

- Makefiie iaden ioadmk 

- Text aus Editor aufnetimen addedittx 

- Text unti Objekt aufnehmen adcitxobj 

- Make verfassen ieavemk 

* Optionen 

- System opsys 

- Compiierüpcomp 

■ Optionen sichern saveconf 



2.3 Das Konzept 

Auch auf die Gefahr hin, daß ich Sie damit langweiien könnte, möciite ich trotzdem noch ein paar 
grundsätziiche Anmerkungen loswerden. 

Prinzipiell kann MtixonPASCAI. in zwei venschiedencn Modi arixiiten: Im „normalen“ Modus, in dem 
man vor allen kleinere Programme (mit nur einem Modul) schreibt, und im „Make“-Modus. Da der 
Projekverwaltung „Make“ ein eigenes Ka[)itel gewidnet ist, befassen wir uns zunächst nur mit dem 
Standard-Modus, der natürlich auch aktiv ist, wenn Sie das MaxonPASCAL-System starten. 

Auch wenn Edward beliebig viele Texte gleiclizeitig beaiiaeiten kann, venvaltet MaxonP.ASC.AI, 
immer nur ein Programm. Das hat zum einen Gründe, die mit dem Speicherplatz Zusammenhän¬ 
gen, und resultiert zum anderen aus der Beobachttmg, daß das in der Praxis nicht besonders rele¬ 
vant ist, weil man normalerweise zwar durchaus mit mehreren Texten, aber an nur einem Programm 
arbeitet. 

Die Funktion „compiie“ übersetzt stets den Text im gerade aktiven Fenster. Bei „run“ wird immer 
zuerst folgendes geprüft; 

- Liegt überhaupt ein übersetztes Programm vor? 

- Befindet sich der Quelltext dieses Programms im aktiven Editor-Fenster? 

- Blieb er seit der letzten Übersetzung unverändert? 




2. MaxonPASCAI. 


25 


Falls eine der drei Fragen mit „Nein“ |■)eantworlel werden miiK, wird die „eom/j//e“-Funktion aul'ge- 
rufen und damit der Text im aktiven Fettster übersetzt. 

So, das sollte gesagt werden, damit Sie beim Rtimprobieren mit MtixonPASCAI. (was Sie wahrschein¬ 
lich schon langst getan haben) nicht in vermeiilhare Verwirrung stürzen (was dabei hoffentlich nicht 
geschehen ist), l.lnd nun folgt endlich eine ausführliche Beschreibung der Funktionen von 
MaxonPASCAI.: 

2.4 Compiler-Funktionen 

2.4 .1 Programme übersetzen 

2.4.1.1 Das Compiler-Fenster 

Am besten langen war mit der Funktion an, wegen der Sie .Ma,xonPASC.AL überhaupt gekauft haben, 
nämlich dem lÜxirsetzen von Programmen. 

Wctin Sie diese Funktion auswählcn, ward - je nach Modus - entw'eder das Programm im gerade akti¬ 
ven Editor-Fenster übersetzt, txler das integrierte „Make“ entscheidet selbst, welche Objektdateien 
neu übersetzt w'erden sollen, ln jedem Fall öffnet sich alterein Fenster, das in fünf Bereiche aufge¬ 
teilt ist. 





:aiti*.3.M0/Ar>aly^j>1or.liyArwly9tarpg?felj*g 3 ts 


..„rtfPfi 


trxnrr. 




“«n<iiii.p‘ ’ . z.ii. " {4a. gg ' ;n~"Sü :' -. 

Error Unknown or Syn^a*: «rfc-r 

IF THEN . i 

_ „ »r :« C L«rF 8 th<»» 

EHO* 

yt !» Str*H*runa<W« 5 <V-mnY,. hoch«»t>} 



EXPO 










In Editor ] flbbrochen I 


Shel 


ijgica 

ff 


PRQCBßÜRE Wrib6P<8-Sti:); 

PROCBDÜRE WritePR<fatypj f?:infcag©r); 

Function Prt(h:p) inbegsE; — 'll' 

Begfin 

Cai«e b'' tßt 
Op«l8boe: C4d« 


IMPORT; 
IMPORT;. 


End; 
Ptl: • 


b:' name Of 
j Prl -Ij 
r : Prl:»2; 
Pti»3 


i 


E3{c& 



♦21/ 421 cfwol 


2:/oera/fln« tyft* t.>r n/Art«! 0 .p 

253/ 253 OfWQl 



Am oberen Rand befindet sich die Staiuszeile. Hier wird stets links der Name der gerade ülx-rsetzten 
Datei angezeigt, während MaxonPASCAI, rechts sagt, was gerade getan wird hzw. zuletzt getan wur¬ 
de. 



















MaxonPASCAI. 


26 


.Am besten probieren Sie es einmal aus: laden Sie einen Paseal-Quelllext (z. B, eines der 
Beispielprogramme) in den Editor und wählen Sie den Menii|)unkt „Übersetzen“ aus. Wenn alles 
klappt, wird oben rechts in schneller Folge (bei kurzen Programmen wohl zu schnell zum Mitlesen) 
das folgende Au.sgegeben: 

- „Compiling“: 

Der Compiler liest und analysiert tias Programm. 

- „linking“: 

Der l.itiker bindet das erzeugte Programm mit den nötigen Bibliotheksfunktionen zusammen. 

- „Fertig“: 

Das Programtn ist übersetzt und ausführbar. Wurden keine Fehler oder Warnungen ausgege- 
beti, verschwindet das Fenster bei dieser Meldung automatisch. 

Natürlich kann dabei beliebig viel scbiefgehen, beispielsweise könnte das Programm fehlerhaft sein. 
Fehlermeldungeti und Warnungen aller .Art werden in dem Rahmen unterhalb der Statuszeile au.sge¬ 
geben. MaxonPASC.AL gibt immer höchstens so viele Fehler aus, wie in diesen Rahmen passen (das 
sind zehn Stück) und wartet auf eine Reaktion des Benutzers, falls die Flüchstzahl erreicht wairdc. 

Eine solche einzeilige Fehlermekiung allein ist meist natürlich nicht aussagekräftig genug. Deshalb 
kann sich der Programmierer jeweils zu einer Meldung ausführlichere Informationen anzeigen las¬ 
sen; 

Unterhalb des Fehlermeldungs-Rahmen befindet sich ein weiterer Rahmen, in den normalerweise 
zwei Zeilen ausgegeben w'erden. Darin stehen Quelltextdatei, Zeilen- und Spaltennummer des gera¬ 
de angew'ühlten Fehlers und noch einmal eine Wiederholung der schon im oberen Rahmen ausge¬ 
gebenen Fehlermeldung. Unterhalb dieser Anzeige .sehen Sie einen Ausschnitt aus dem Quelltext 
mit einem Pseudo-Cursor an der fraglichen Position.Wenn allerdings der Linker Fehler meldet, steht 
anstelle der Sourceposition (w'as weiß ein Linker schon von Quelltexten!) schlicht „Linker Error“, 
und dort, wo sonst der Quelltext-Ausschnitt dargestellt wird, steht eine eventuell verkürzte Liste der 
beim Zusammenbinden aufgetretemen Fehler, also hauptsächlich Namen von Undefinierten oder 
gleich mehrfach definierten Linker-Symltolen. 

Weniger häufig treten beim Übersetzen unter dem Titel „Fatal Error“ Fehler bei der 
Codegenerierung oder beim Assemblieren auf. Meist sind diese auf Speichcrmangel zurückzu¬ 
führen. und dementsprechend heißen sie „Out of Memory“, „Workspace overflow“ oder wie 
auch immer. 

last not least gibt es ganz unten im Compiler-Fenster noch eine Gadgetleiste. Zunächst ist hier nur 
das Gadget ganz rechts mit der Aufschrift „Abbrechen“ an wählbar. Bei Bedarf w'erden die übrigen 
Gadgets aktiviert. 





2. MaxonPASCAI. 


27 


2 . 4 . 1.2 Abbruch und Ausstieg 

Ini Gegeasatz zu einfachen K()mmaiul()zeilen-Cum()ilern besitzt das M;txonPASCAL-Fenster eine 
Vielzahl von Knöpfen und Funktionen, an denen der Pascal-Programmierer herumspielen kann. Alle 
Gadget-Funktionen sind, um den Kediirfnissen der „echten Programmierer“' entgegenzukommen, 
auch durch Tasten oder Tastenkombinationen bedienbar. 

Beim Start des Comjtilers können Sie im Compiler-Fenster zunächst nur zss'ei Dinge tun: Das 
Fenster schließen (xler die Übersetzung abbrechen. 

Mit einem Klick auf das SchlieK-Gtidget wird die Übersetzung abgebrochen und das Fenster 
geschlos.sen. Die Taste <ESC> hat die gleiche Wirkung. 

Außerdem gibt es unten rediLs das Irereits erwähnte „Abhrechen“-Gid^a. Man l-tenutzt es, wenn 
man den Compiler zwar abbrechen, aber noch irgendwelche im Window ausgegebenen Meldungen 
in Ruhe lesen möchte. Die kanonische Tastenkombination <Control> + <C> entspricht diesem 
Gatlget. 

Falls der Compiler ater schon fertig ist, wird das Compiler-Fenster bei einem Klick auf 
„Abbrechen“ geschlossen. 

2.4.1.3 Auswahl von Fehlermeldungen 

Laut Muiphy geht bei so ziemlich jedem Compiler-Iaiuf emas schief, und meist sogar etw'as mehr als 
nur „etwas“. Deshalb bietet das Comitiler-Fenster Platz für bis zu zehn Fehlermeldungen auf einmal. 

Eine dieser jeweils einzeiligen Meldungen ist immer invertiert und somit hervorgehoben, und zu 
genau dieser Meldung werden unterhalb des Rahmens zusätzliche Informationen angezeigt. Mit 
einem Mausklick auf eine Fehlerzeile macht man diese zur gerade privüegierten, invertierten 
.Meldung. 

Das geht aber auch über die Tastatur: .Mit der <Leertaste> durchläuft man die Fehlermeldungen 
von oben nach unten, und mit <Backspace> in die andere Richtung. .Alternativ können Sie auch 
die Cursortasten <.Auf> und <Ab> benutzen. 

2.4.1.4 Vom Compiler In den Editor 

Der besondere Witz an einer integrierten Umgebung ist das perfekte Zusammenspiel von Compiler 
untl Editor, in.sbesondere das automatische Anspringen von Fehlerstellen. 

Das funktioniert bei MaxonP.ASC.>AL denkirar einfach: Sobald eine Fehlermeldung im Compiler- 
Fenster au.sgegeben wird, werden auch zw'ei Gadgets mit der Aufschrift „Attspringen“ bzw. „In 
Editor“ aktiviert. Nun wählen Sie wie oben beschrieben Ihre Wunsch-Fehlermeldung aus (das gehl 
übrigens auch, während der Compiler noch arteätet) und klicken „Anspringen“ an. Prompt lädt 
Edwartl die zugehörige QucTItextdatei (falls der Text nicht ohnehin schon im Editor vorliegt) und 
setzt den Cursor an die bemängelte Position. Nun können Sie den Fehler terichtigen - vorausgesetzt 
natürlich, der Compiler läuft nicht noch unil hat ein „Lock“ auf diesen Text eingerichtet. Das 
Compiler-Fenster wird dabei nicht geschlossen, ,so daß Sie noch weitere Fehlerstellen anspringen 
können. 



MaxonPASCAL 


28 


Die Imegraiwn von Com|3iler und Editor geht allerdings niclit so weit, daß im Compiler-Fenster 
Quelltext-Veränderungen beachtet würden. Wenn Sie z. B. zuerst einen Fehler berichtigen und 
dabei einige Zeilen einfügen oder löschen müssen, merkt MaxonPASCAl. nichts davon. Sollten Sie 
also anschließend ein weiter unten im Quelltext gelegene Fehlerstelle anspringen lassen, landen Sie 
gnadenlos in der Zeile mit der Nummer, in der der Fehler lag, als er hemerkt wurde - und durch die 
inzwischen vorgenommenen .Äntlenmgen stimmt diese Zeilennummer inzwischen vielleicht nicht 
mehr, unti Sie landen einige Zeilen zu hoch oder tief. Das dürfte aber in der Praxis kaum ein 
Problem darstellen, denn im Compiler-Fenster wird immer noch der ursprüngliche Quelltext mit 
dem Cursor an der richtigen Stelle angezeigt, und durch einen kurzen Textvergleich zwischen 
Compiler- und Editorfenster können Sie schnell die wirkliche Fehlerposition „zu Fuß" an,steuern. 
Außerdem ändert man in der Praxis Irci Compilerfehlern meist sowieso nur die fragliche Zeile, ohne 
großartiges Löschen und Einfügen von Zeilen. 

Das Gadgct „Anspringen“ ist nebenbei bemerkt mit dem Shorteut <A> belegt. 

.Manchmal tritt w'ährend der Ühersetzung nur ein einziger Fehler auf, der vielleicht noch den einen 
oder anderen Folge-Fehler nach sich zieht, aber trotzdem nur eine einzige .Antlerung am Quelltcxt 
notwendig macht. Deshalb gibt es auch noch das Gadget „In Editor“. Hier wird im Etlitor die gera¬ 
de angewählte Fehlerposition angesprungtn (genau wie beim „AMS/)r/w,gen“-Gatlget) und gleich¬ 
zeitig das Compiler-Fenster geschlossen - wobei natürlich auch der Compiler abgebrochen wird, 
sollte er noch am arheiten sein. 

Alternativ können Sie auch die Tasten <Return> oder <E> drücken, und ebenso gut können sie 
auch mit der Maus einen Doppelklick auf die Fehlermeldung machen. 

2.4.1.5 „Weiter" 

Treten heim I.ibersetzen hzw. Linken mehr Fehler auf, als im Rahmen dargestellt w'ertlen können 
(das sind bekanntlich zehn Stück), wartet der Compiler erst einmal ab, und da.s„We//er‘'-Gadget 
w'ird anwählbar. Nach einem Klick auf selbiges läuft der Compiler wieder weiter, bis erneut zehn 
Fehlermeklungen voll sind. Meist ist es aber nicht unhedingt sinnvoll, nach mehr als zehn Fehlern 
noch w'eiter zu übersetzen, denn normalerweise kommt dabei nicht mehr so ganz viel sinnvolles 
raus. Deshalb wird man in der Regel das „W'efter“-Gadgct meitten und lieber die Fehler korrigie¬ 
ren. 

2.4.1.6 Programmstart aus dem Compiler-Fenster 

Wenn MtrxonPiVSC.AI. bei der Übersetzung keine Fehler, sondern nur Warnungen ausgegeben hat, 
wird ein laufflthigcs Programm erzeugt. Wenn das dann auch noch zusammengebunden (gelinkt) 
werden konnte, taucht unten rechts das „Atortew“-Gadget auf. Mit einem heherzten Klick darauf 
können Sie das Programm starten. 

2 . 4 . 1.7 Erneutes öffnen des Compilerfensters 

Wenn Sie das Compiler-Fenster geschlo.ssen haben und es doch noch einmal sehen wollen, können 
Sie es mit dem Menüpunkt „Fehlermeldungen“ noch einmal öffnen. Wie der .Name schon andeu- 


2. MaxonPASCAL 


29 


tin, sind dann alle Felilermeldiingen der letzten Compilierung wieder sichbar, und auch sonst prä¬ 
sentiert sich das Fenster in dem ZustantI, in dem es sicli beim SchlieKen befand. 


2.4.2 Ausführen und Abbrechen 

Die zweite wichtige Funktion aus dem „Compiler '-Menii heibt Ausfuhren“ und tut auch genau 
das: Ein Pascal-Programm wird gestartet. 

Vorher prüft MaxonPASCAL allerdings noch, ob nicht vielleicht erst noch der Compiler konsultiert 
werden muß, und startet selbigen automatisch. 

Anschließend ward ein Text-Fenster für die Ein- und Ausgaben des Programms geöffnet. Falls das 
Programm tat.sächlich etwais ausgegeben liat, erscheint nach erfolgreicher ProgrammausFührung die 
Aufforderung „Press Return“ - Sie sollen also die < Return>-Taste driicken und so bestätigen, daß 
Sie die Au.sgaben des Programms auch gelesen haben. 

Wälirejul das Programm lätifi, sind verschieticne Funktionen des Systems gesperrt, z. 13. darf man es 
(trotz Multitasking) nicht ein zweites mal gleichzeitig starten, oder man kann den Com|riler nicht 
laufen lassen, weil man dem laufenden Programm ja dadurch den Code unter den Füßen wegziehen 
bzw. übersebreiben würde. Das ist sicher sinnvoll und stört wohl nicht w'citer - es sei denn, das 
Programm ist irgentlwo hängengebliehen und läßt sich nicht normal beenden. 

Gegen „normale“ Endlosschleifen Irilfi die Compileroption „Unterbrechen“. Schwieriger wird cs 
dagegen, wenn der Piozeß abgestUrzt ist, auf ein Ereignis wartet, das nie eintreten kann oder die 
erwähnte Breakpoint-Option einfach nicht benutzt wurde. Desitalb (und nur für solche Fälle!) gibt 
es im Com|riler-Menü die Funktion ,gU>brechen“, die tien gestarteten Prozeß schlicht abtötet und 
dann das Ausgabe-Fenster schließt. Auf den ersten Blick eine praktische Lösung, alter leider gibt es 
auf tlem Amiga (im Gegensatz z.B, zu Unix) keine saubere Möglichkeit, einen Prozeß aus dem 
System zu entfernen. Insbesondere werden dabei keine Ressourcen (reservierter Speicher, geölTne- 
te Dateien, Screens und Fenster etc.) freigegehen. Sie müssen davon ausgeheit, daß sie auf diese 
Weise freien Speicher verlieren, wenn Sie einen lü'oz.eß auf diese brutale .Art abbrechen. .Aber das ist 
im Zw'eifel immer noch angenehmer, als das .MPASCAI.-System neu zu starten oder gar den Rechner 
zu booten. 


2.4.3 Exe- und Objektdateien 

Ungeachtet allen damit verbundenen Komforts wealen Sie ihre Programme wtthl nicht immer nur 
aus der integrienen Umgebung starten wollen. Desliallr gibt es im ,,Compiler“-Menü zwei 
Funktionen, die das übersetzte Programm in Dateien schreiben; 

„Exe-Datei“ erzeugt eine ausfühdrare Programmdatei - vorausgesetzt natürlich, ein Programm 
ist korrekt übersetzt und gelinkt worden. 

»w' „Objekt-Datei“ schreibt zur zuletzt compilierten ilbersetzungseinheit eine Objektdatei, aus 
der m;in später ein ausführbares Programm erzeugen kann. Im „Make''-Modus ist diese 




MaxonPASC^ 


30 


Funktion nicht unbedingt sinnvoll, denn dort werden liiese Objektdateien ja beim Compilicren 
automatisch er/eugt. 


2.4,4 Daten und Informationen 

Mit dem Meniiptmkt „Information“ bffnet man ein Fenster, in dem Informationen über den Status 
von MaxonP.VSCAJ. angezeigt und stäntlig aktualisiert werden. .Neben dem üblichen Rhabarber über 
Autorschaft und Copyright (klicken Sic doch einfach mal auf den Namen des Autors...) können Sie 
hier hei bedarf nachlesen, welchen Quellte.xt Sie zuletzt ültersetzt oder welche Make-Datei gerade 
geladen ist. Liegt ein ülx;rsctztes Programm im Speicher vor, wird auch seine GröRe angegeben. 
Dalrei handelt es sich genaugenommen um den Platzbedarf des Programms, wonn es in den 
Speicher geladen wird, und nicht um die GröRe der Exe-Datei. 

2.5 Features und Optionen 
2.5.1 Ein kurzer Überblick 

Für viele Programmierer ist das Schönste an einem Compiler, daR man so viele Optionen und 
Switches hat, an denen man herumspielen kann, bei MaxonPASCAL nimmt man sämtliche dieser 
Einstellungen über Requester vor, deren es genau zwei gibt: Einen - „System“ - für allgemeine 
Einstellungen, die in irgendeiner Weise mit dem MaxonP.ASCAl.-Systcm zu tun haben und einen für 
die unvermeidlichen Compiler-Optionen. 

Wenn Sie wollen, können Sic beide Requester gleichzeitig öffnen. In jedem der Fenster linden Sie 
am unteren Rand die obligatorischen Gadgets „OK“ und „Abbruch“, mit tienen Sie die vorgeiutm- 
menen Einstellungen bestätigen bzw. Sie wieder veroerfen können. 


2.5.2 Der Compiler-Requester 


0 1 Cotopte" Octiom 


ilauptd«t«> l: | Ifltl 

■»/' 1 Subrangp 


( Indeisberelch 

.J.nc lude-Pf «d : |RRM; Ihc (wd* ■ ~ 

v^l tlntgrbPPCbgn 

Kop ier-Pf ad s |Pasc« t: I(ic (u«tP 

1 StackaPBB* 

ünSt-Pfad: tRM1:Unlt - ~ 

‘ iQptthn. jibertauf 

Kopler-Pf ad! SUnIt. 

_Ijtbbuospr-batel 

Ltnkep: 0| anoss/kidln •«»< f 

Rutonatisch errzeugen: 

Maka-Ufllt»! | 1 

■v' t EKd-Patc l 

Hrbeltjtapplcher: MdB | KBvte 

> ObJ^ektdatpt 

OK 1 

fibbrechan f 


2.5.2.1 Die Hauptdatei 

Wenn Sie eine Unit übersetzt haben, wollen Sic wahrscheinlich anschließend auch testen, ob sie 
funktioniert. Beim Versuch, sie wie ein Programm zu starten, werden Sie von der MaxonPASC.AL- 




2. MaxonPASCAI. 


31 


Umgebung allerdings nur eine ents|rrechende Fehlermeldung erhalten. Deshalb können Sie eine 
sogenannte Mauptdatei (in Version 2.x noch „Main File” genannt) angeben, die immer dann automa¬ 
tisch compiliert wird, wenn eine Unit übersetzt wmrde. Sinnvollcrweise wird dies dann ein 
Programm sein, das Ihre Unit auch benutzt. 

Der Name dieser Datei kann im Textfeld „Hauptdatei“ des Compiler-Requesters eingetippt w'er- 
den. Gleich rechts von jenem linden Sie ein Gadget, das den Filerequester öffnet und so die 
Auswahl der Hauptdatei bequemer macht. Fan Klick auf das schlicht mit „L“ beschriftete Symbol 
löscht tien Inhalt des Textgadgets. 



Im Make-Modus wird die Hauptdatei generell ignoriert. 


2.5.2.2 Pfade für Include-Dateien und Units 

ln vier Textfeldern können die Verzeichnisse eingetragen werden, in denen MaxonPASC.Al. Units 
unti Indudes suchen soll. Optional kann jeweils ein zweites Verzeichnis angegeben werden, in das 
die Dateien automatisch umkopiert werden. Mehrdaz.u in den Kapiteln über Indudes bzw. Units. 

2.5.2.3 Eine „Linker"-Einstellung 

Der integrierte Linker von MtixonPASC.AI. ist im wesentlichen zum Amiga-Standard-Linker .Alank” 
(bzw. der besseren PD-Version „BLink") knmpatihel. Jener Linker erkennt Bezeichner nur dann als 
identisch, wenn Sie in ihrer Groß-zKleinschreibung übereinstimmen. Beispielsweise sind für ihn 
„Test“ und „test“ zwei verschiedene Namen. Dagegen ist man es als Pascal-Programmierer gewohnt, 
daß die Schreibweise von Bezeichnern keine Rolle spielt. Deshalb haben Sie durch dieses Menü die 
Wahl, oh der integrierte MaxonPascal-l.inker sich Pascal-mäßig verhallen („GROSS/klein egal“) 
oder sich an den ,ALink“-Standardhalten soll („GROSS/klein beachten“). 

2.5.2.4 Units im Make-Modus 

Die neue Projektverwaltung „Make" unterstützt die Verwaltung von Projekten, die in Module geglie- 
den sind. Dabei wird man aber meist nicht auf Units verzichten wollen. Ab.schnitt 7.9.2 („Units und 
Module“) verrät Ihnen alles, was Sie bei tler Kombination dieser beiden Konzepte zu beachten 
haben. 

Nun gibt es für das „Make“ aber noch ein Problem: Da es immer nur die Module recompiliert, bei 
denen es auch sein muß, kennt es nicht alle im Projekt benutzten Units. Deshalb wird das 
Nachladen von Units im Make-Modus etwas anders gehandhabt: Sie als Programmierer haben die 
(sicher nicht übermäßig schwere) Aulgabe, alle im Projekt benutzten Units in das Gadget „Make- 
Units“ im Compiler-Requester einzutragen. Beim Linken des Projekts werden dann diese (und nur 
diese) Units dazugeladen. Die Namen der Units sind ohne Punkt untl Komma, aber mit Leerzeichen 
getrennt einzugeben, z. B. „Printer Intuition Window's./PascalCrt“. 




MaxonPASCAL 


32 


Hinweis 


Außerhalb des Make-Modus hat dieses Gadget keinerlei Bedeutung. 

2.5.2.5 Arbeitsspeicher 

Als (eliemaliger) KickPa.scal-AnweiKler werden Sie sicli noch daran erinnern, daK Sie beim Start des 
KP-System.s immer die Gröl;le tles „Workspace“, al.so des Aiiicitsspeichers, auswählen mufsiten. Bei 
MaxonPASCAl. ist das nicht mehr nötig, denn der Etlitor Edward vewaltet seinen Speicher voll dyna¬ 
misch. 

Nach wie vor braucht aber der Compiler einen zu.sammenhängenden Speichcrblock ausreichender 
Größe. Diese Form der Speicherverw'altung ist vielleicht unschön, aber zugleich eine der Ursachen 
für die Geschwindigkeit des MaxonP.\SCAL-Compilers. 

Utnger Rede schwacher Sinn: Der Compiler reserviert sich al.so einen gewissen .Arbeistspeicher, und 
wenn dieser während tier Übersetzung überläufi, gibt es eine Fehlermeldung, ln diesem Fall sollten 
Sie den Eintrag „Arbeitsspeicher“ im Compiler-Requester nach Gutdünken hochsetzen. Für 
mittelgroße Pnjgramme ist die Voreinstellung von 80 KByte aber ausreicbend. 

2.5.2.6 Diverse Compiler-5chalter 

Oben rechts im Compiler-Requester finden Sie sieben Schalter, mit deneti Sie jeweils bestimmte 
Compiler-Optionen ein- und aus.schaltcn können: 

• Subrange testen: 

Die Grenzen von Ausschnittstypen sintI bei Wertzuweisungen zur Laufzeit zu prüfen. 

• Indexbereich: 

Bei Array-Zugriffen sind die Grenzen zu testen. 

• Unterbrechen: 

An geeigneten Stellen wird im Code eine ülxtrprüfiing der Signalbits eingebaut, so ciaß das 
Programm mit der 'l'astcnkombination Control-C abgebrochen werden kann. 

• Stackgröße: 

Ein iiberlaufdes Laufzeitstacks ist abzufangen. 

• Arithmetischer Überlauf: 

Bei Reebenoperationen jeder Art sintI Überläufe abzufangen. 

• Semikolon melden: 

Fehlende Semikoki (al.so diese Dinger) sind als Fehler zu mekien. Das etwas obskure 
Kickfwscal-Feature, fehlende Semikola automatisch ergänzen zu lassen, wird von MaxonPASCAl. 
nicht mehr unterstützt. Allerdings führt ein solcher Fehler aber auch nicht zum Abbruch der 
l Übersetzung. 



2. Maxon PASCAL 


33 


• Debugger-Datei: 

Isi diese Optiun aktiviert, werden die Dateien Tiir den demnächst erhältlichen Debugger 
er/eugt. 

2.5.2.7 Automatisches Erzeugen von Dateien 

Mit den beiden Schaltern „Exe-Datei“ ttnd „Objektdatei“ können Sie wählen, ob MaxonP.ASCAI- 
nach jeder Übersetzung da.s Programm als atisRihrbare bzw, linkbare Datei schreiben soll. Die 
Übjektdatei-Einstellung hat im Make-Modus keine Wirkung, denn dann werden die Linker-Dateien 
s(.)wieso geschrieben. 


2.5.3 MaxonPASCAL-Systemeinstellungen 

Mit tlem zweiten Dtalogfenster, das Sie mit „System“ aus tlem „Optionen“-Menü öffnen, können 
diverse Rinstellungen der .MaxonP,VSC/\I,-rnigebung vorgenommen w'erden. 


2.5.3.1 Erzeugen von icons 

“Icons erzeugen“ legt fest, ob .Ma.xonP,ASCAL beim Schreiben von ausführbaren Dateien, Makeftles 
und Debugger-Dateien jew'cils ein Icon erzeugen soll. 


o I System Clptl«i3 






]:Si 

_|J.cons erzeugen ’M“ 

>/' t Make-I>atet; Rbhting Igkelten autonatlsch setzen.-,-'". 


_I Laufze»t’-£rotoko l I |prt ! 

firgur»ent-J,tr ing! | 

Jgxfcerner flssenbter: 
Debugger: 

J„auf zeit »Stack! 

Rutosave bei{.Bun: 

Date lausuah : 




IIK 


J 


[pasca t ! b tn/'wasH Sü. asw -c c to -u SlFI 


E 


IW 






m 


Bus . 


. 'lar' 

Ji 1. 


Ol 


RCT 




•J -i-yiijai-i s 

Bbbrechen | 


2.5.3.2 Abhängigkeiten in Make-Dateien 

Die integrierte Projektvenvaltung entscheidet souverän, w'ann welches Modul eines gröläeren 
Programms neu compiliert werden muli. Dazu muK sie aber wissen, vott welchen Quelltextdateien 
ein Objekt abhängig ist. Diese .Alahängigkeiten kann der Benutzer durchaus von Hand setzen - 
bet|uemcr tind sicherer ist es allertlings, wenn man diese Aufgabe MPASCAl- überläKt. 


Wenn sie tias Symbol „Make-Datei; Abhängigkeiten automatisch setzen“ angewählt haben, 
palSt MiLxonPkSCAL beim Compilieren auf, welche Includedateien hei den einzelnen Objektdateien 
gelesen w^erden, und trägt diese tltmn als Alihängigkeit in die Make-Datei ein. 










MaxonPASCAL 


34 


2.5.3.3 ProtokoUieren von Ein- und Ausgaben 

Wenn Sie tlie Option „Laujxeit-Protokoll" einschulten, werden sowohl die Ausgalxni des 
Programms als auch die Eingaben des Benutzers in eine Datei geschrieben. Der Dateiname ist im 
Textgadgel einzutragen, wobei „prt:“, also tler Drucker, als Defaultwert vorgegeben wird. 

2.5.3.4 Argumente aus der imaginären Kommandozeile 

Beim Start von der Shell kann man Programmen Argumente übergeben, die in P.ASCAL mit den 
Variablen „PanimeterSlr“ und „ParameterLeti“ (siche Ka|t 6.1) ausgewertet werden können. Auch 
beim Programmstart aus der Encwicklungsumgebung von MaxonPASCAL kann man diese An tler 
Parameterübergabe simulieren, itidem man sie im Textgadget „Argument-String“ eingibt. Diese 
.Argumentzeile wird dann an aus .MaxonP.ASC.Al. gestartete Programme übergeben. 

2.5.3.5 Einbindung des Maxon Assemblers 

ln .MaxonP.ASC.AL beherrscht das integrierte Make auch sogenannte Regeln, die möglichenfalls auto¬ 
matisch angewendet werden, wenn für eine Objekidatei keine Comitileranweisung vorhanden ist. 
Zwei dieser Regeln sind sogar schon „eingebaut": Zum einen die „.p.o“-Regel, die besagt, dalä eine 
auf „.o“ endende Datei, zu der eine „,p'‘-Datei gleichen Namens existiert, als Pascal-Programm com- 
piliert werden kann, und zum anderen die „.a,sm.o“-Regel für Assemblersourcen. Diese Regel kön¬ 
nen Sie über das Eingabefeld „Externer Assembler“ frei bestimmen. 

Default ist Pascal:Bin/masm |*.a,sm -c cl -v $*.err 

Das „$*“ ward (wie immer bei Make-Regeln) durch den endungslosen Dateinamen ersetzt. .Ai.so wird 
für jede auf „.o“ endende Objektdatei, für die es im Makefile keine Compileranweisung, dafiir aber 
auf der Platte eine pa.s.sende „.asm“-Datei gibt, automatisch ein solcher M;ixon Assembler-Aufruf 
erzeugt. 

Diese Regel wird auch benutzt, wenn mit dem .Menüpuni „Text und Objekt aufnehmen“ eine auf 
„.asm“ endende Quelltextdatei in das .Makefile aufgenommen wird. Auch in diesem Fall erhalten Sie 
also automatisch einen passenden Assembleraufruf 

Vielleicht fallt Ihnen die „-v‘'-Option auf Der Maxon Assembler ist so weit in das System integriert, 
daß MaxonPASCAL die MaxonASM-Fehlerdateien inteqjretieren kann (und genau diese werden 
durch erzeugt). Wenn MaxonPASCAL ein Assemblermodul auf diese weise „extern“ übersetzen 
läßt, liest es anschließend diese Fehlerdatei ein und zeigt die Assemblerfehler im normalen 
Compiler-Fenster an. Prima, nicht? 

2.5.3.6 Debugger 

Der Menüpunkt „Debugger“ ruft falls vorhanden die Ma.xonP.ASCAL-Ver,sion des MaxonSDB auf 
Damit MaxonPASCAL auch weiß, was dabei zu tun ist, gibt es das Gadget „Debugger“ im System- 
Einstellfenster. Hier ist die Shell-Anweisung anzugehen, die von MaxonPASCAL ausgeführt werden 
Süll (bis auf den Dateinamen, denn den hängt MPASCAL einschließlich des Argumentstrings immer 
automatisch an), Default ist PascabBin/MaxonSDB < > CON:0/0/640/120/MaxonSDB 




2. MaxonPASCAL 


35 


Wie Sic sehen, wird hier gleiclizcitig das Fenster für die Ein- und Ausgaben des debuggten 
Programms festgelegt. 

2.5.3.7 Stackgröße 

Wenn ein Programm aus MaxonPASCAI. gestartet wird, braucht es natürlicb auch einen Stack, und 
im Zweifelsfall nicht zu wenig davon. Die gewün.schte Größe kann ebenfalls im „System -Requester 
eingestellt werden. 

2.5.3.8 Autosave 

Wenn die „AM/o.' 5 flt.’e“-Option vom MaxonP.5SC,\L eingeschaltet ist, w'erden beim Start eines 
Programms aus der integrierten Umgebung automatisch alle Editor-Texte abgespeichert, .sofern dies 
noch nicht geschehen ist - bestimmt eine sinnvolle Maßnahme. Dieser Autosave sollte nicht mit 
dem zeitabhängigen Autosave des Edward verwechselt werden. 

Es gibt hier sogar gleich drei verschiedene Einstellungen: 

• Aus: 

Der MaxonP,\SC.5L-Autosave unterlrleibt. 

• Texte sichern: 

Die Texte im Editor werden nötigenfalls abgespeichert. 

• Texte und Session: 

Zusätzlich werden die „.SESS10N“-Dateien von Edward und MPASC.AL geschrieben. Dadurch 
halx;n Sie nach einem Altsturz untl erneutem Start von MPASCAl. wieder alles so vor sich, wie es 
gewesen war. 

2.5.3.9 Dateiauswahlbox 

Der RCT-Fileretiuester hat seine Fans (mich eingeschlossen), alter Commodore sieht es gar nicht 
gern, wenn man gegen seine Richtlinien verstößt. Deshalb kann zwischen RCF- und ASL- 
Dateiauswahlbox frei gewühlt werden. 


2.5.4 Abspeichern der Konfigurationsdatei 

2.5.4.1 Allgemeines 

Wenn im aktuellen Verzeichnis keine Datei „mp.SESSlON" gefunden wird, liest MaxonPASCAL die 
Einstellungen aus der Datei „S:mp.CONFIG“ (siehe auch Abschnitt 1.2.3), und wenn es die auch 
nicht gibt, werden eben die internen Voreinstellungen verwendet. Mit dem Menüpunkt „Optionen 
sichern“ werden alle aktuellen Einstellungen von MaxonPASCAI. (ausgenommen natürlich der 
Editor-Zustand) in „S:ntp.CONFIG'' altgespeichert. 

An dieser Stelle .soll noch darauf eingegangen werden, wie diese Konfigurations- und Session- 
Dateien eigentlich aufgebaut sind. Zwar werden Sie darin kaum einmal etwas von Hand ändern, 
aber Sie müssen es wLssen, wenn Sie über den .ARexx-Befchl „setopt“ MaxonP.\SC,\L-Einstellungen 
ändern (siche 2.6.3.6) 



MaxonPASCAI. 


36 


Die Konfigurationsdateien sind Texte mit einer beliebigen Folge von Optionen, die jeweils mit 
einem beginnen. 

2.5.4.2 Der Editor 

Zunächst ist da ein Eintrag -X“Hdward:Edward‘' 

Wie Sie sich vielleicht denken können, entnimmt MaxonPASCAI. dieser Angabe, woher der Editor 
Edward geladen werden soll. Falls Edward in Ihrem System nicht unter diesem Ptad und Namen zu 
finden sein sollte, können Sie diesen Eintrag ändern. Sie sollten aber nicht unbedingt versuchen, auf 
diese Weise einen anderen Editor als Edward einzubinden, denn nach derzeitigem Stand beheiTscht 
kein fremder Editor das kompilzierte Message-Protokoll zwisclten MaxonPASCAI- unti Edward. 
Alternative Editoren können atisscbließlich über ARexx (Kapitel 2.6) integriert werden. 

2.5.4.3 Fensterdaten 

/Vm Anfang der Konfigurationsdatei finden Sie gewöhnlich eine ganze Reihe von Einträgen, die mit 
Xn“ beginnen (wobei n eine Zahl zwischen 1 und 9 ist). Diese Daten legen Position und Größe der 
Fenster von M:txonP;\SCAI- fest und sollten nie manuell verändert W'Crden. 

2.5.4.4 Switches und Schalter 

Die Optionen „-XIO“ bis „-X18‘‘ reprä,sentieren diverse Schalterstellungen der integrierten 
MaxonP.ASCAl.-Umgebung. Es folgen jeweils stets ein Komma und die Schalterstclhing - meist „ü“ 
oder „1“, manchmal aber auch höhere Nummern. 

Und das bedeuten diese Einträge; 

-XIO: Exe-Datei automatisch erzeugen? 

-XI1: Objektdatei automatisch erzeugen? 

-X13: Icons erzeugen? 

-X14: Protokolldatei schreiben? 

■X15: Autosave (f) = .Aus", 1 = „Texte sichern“. 2 = „Texte -f Session“) 

-X16: Größe des Laufzeitstacks 

■X18: Dateiauswahlbüx (0 = RCT, 1 = ASL) 

2.5.4.5 Stringoptionen 

Die Einträge „-X20'' bis „-X23“ geben den Inhalt von vier Stringgadgets wieder und erwarten folge¬ 
richtig als Argument eine „so“ eingeschlo,ssenc Zeichenkette: 

-X20: Name der Protokolldatei 

-X21: Argumentstring bei Programmstart aus der Umgebung 

■X22: A.ssentbleraufiruf 

-X23: Debuggeraufruf 





2. MaxonPASCAL 


37 


2.5.4.6 Compiler-Einstellungen 

Die binären Compilerschalier werden wie folgt codiert: 


Option 

Aus 

Ein 

Subrange testen 

•gr 

-8 

Rindexbereich 

■8' 

■gl 

Unterbrechen 

-gb 

-gB 

Stackgröße 

-gs 

-gs 

Arithmet. iiberlatif 

■gv 

■gV 

Semikolon melden 

-ps 

-ps 

Debugger-Dateien 

-bO 

-b 

-Make-.Mzhängigkeiten automatisch 

-IllX 

-niX 

Linker. Großfklein egal 

-Ic 

-IC 


Der Compiler-Arbeistspeicher ist mit tler Option „-w“ einziistellen, also z. B. „-w2ü0“ für 2ÜÜ KB^ae, 
und mit „-M“ wird die Hauptdatei festgelegt. Mit den Optionen „-i" und „-u“, jeweils gefolgt von 
einem Pfadnamen, wfcrden die Pfade für Incltitles bzw. Units definiert. Die Pfade können, müssen 
alx'r nicht in Mifühmngszeichen eingesclilossen werden. Wollen Sie zugleich einen Kopierpfad 
angeben, so sind die beiden Pfade tlurcli ein „|“ voneintmder zu trennen, z. B. „-i 
Pascahincltide | ramiincliide“. Last not letist können Sie bei Bedarf auch mit der Option „-U“, gefolgt 
von einem Unit-Namen, tlie Rinstelltmg „Make-Units" vornehmen. Diese Option arbeitet allerdings 
inkrementeil, d. h. jedes „-U“ hängt einen weiteren Eintrag an, statt die bisherigen Einträge zu über¬ 
schreiben. Eine Ausnahme bildet ‘-U ,,“h Damit löscht man alle bisherigen Unitnamen. Letzteres wird 
zwar in den Konfigurationsdateien nicht benutzt, ist aber vor allem dann wichtig, wenn man über 
den ARexx-Pürt des Compilers Optionen verändern wäll (diese .Anmerkung bezieht sich auf den .set- 
opt-Befebl aus .Abschnitt 2.6.3.6 tmtl braucht Sie im Mt.iment noch nicht zu kümmern). 

2.6 Die ARexx-Schnittstelle 
2.6.1 Grundlagen 

Die Programmiersprache Rexx ist in ihrer Amiga-Portierung ,ARexx“ zu beachtlicher Popularität 
gelangt, obwohl Rexx im Wirklichkeit doch eigentlich elier eine Script-Sprache und für „echte" 
Programme ziemlich unbrauchbar ist. Der tiruntl für diesen phänomenalen Erfolg ist (einmal abge¬ 
sehen davon, daß .ARexx ab Workbench 2.Ü zum Liefertimfang jedes Amiga gehört), daß ARe.xx sich 
in hervorragender Weise dazti eignet, Programme „von außen" zu steuern und so zum einen kom¬ 
plexe Abläufe zti automatisieren und zum anderen wiklfremde Programme zu einem System zu 
kombinieren. 

Voraussetzung tiafür ist, daß die Programme einen sogenannten .ARexx-Port besitzen. Ein .AlLexx- 
Programm kann Anweisungen an eine solche Software-Schnittstelle schicken, und wenn das ent- 
sprechentle Programm über einen geeigneten Befehlssatz verfügt, kann der Rexx-Programmierer 
Programmfunktionen mit einem ARexx-Script fernsteuern. 




MaxonPASCAl. 


38 


Der Editor „Edward“ besitzt eine soiche Schnittstelle, und ila Edward Anweisungen an MPASCAL 
weitergeben kann, läßt sich die Compiler-L'mgebung natürlich über diesen Umw'eg steuern. 

Ein Beispiel: Das ARexx-Script 

ADDRESS "EDWARD” 'SendAppComm "compile"' 

veranlaßt MaxonP.ASCAI„ den int Etlitor befindlichen Quelltext zu übersetzen. Voraussetzung dafür 
ist natürlich, daß MaxonPASCAL zuvor gestartet wurde. Mit der ARexx-Anweisung „ADDRESS“ legt 
man übrigens fest, wie der Port heißt, mit dem das Script kommunizieren soll. 

Es bleibt noch die Frage offen, was man macht, wenn man MaxonPASüM, ohne Edw'ard benutzen 
unii fernsteuern möchte ■ z. B. weil man einen anderen Editor bevorzugt (nahezu völlig unverständ¬ 
lich!) und diesen über ARexx in das MaxonPASCAL System integrieren möchte. 

2.6.2 Der ARexx-Port 

In Abschnitt 2,1 wurde bereits angedeutet, daß MPASCAL dafür vom CU bzw. der Shell aus mit der 
Option „-r“ zu starten ist, z. B. mpascal -r 

ln diesem Fall wird ein Port mit dem Namen „MAXONP.MsCAL“ eingerichtet. Falls ein solcher schon 
existiert (kommt insbesondere vor, w'enn MaxonPASCAl, mehrfach gestartet wird), werden so lange 
„MAXONPASCALl“, „.M3XONPASCAL2‘' usw. ausprobiert, bis ein noch nicht belegter Name gefun¬ 
den wird. .Mternativ können Sie auch hinter dem „-r" einen beliebigen Portnamen vorgeben, z. B. 

MPASCAL -r "Bla Fasel Sülz!" 

Generell werden solche Purtnamen in Gritßbuchstaben umgewandelt. Auch hier werden swtemweit 
eindeutige Namen sichergestellt und ggf „BIA FASEL SÜLZll“ usw. ausprobiert. 

In jeden Fall startet nun MaxonPASCAL, meldet sich und gibt zur Kontrolle den Portnamen aus. 
Edward wird nicht geladen, MaxonPASC.Al, kommt im .ARexx-Modus völlig ohne ihn aus. 

Wenn Sie den Default-Namen verwenden, können Sie Ihr Script also locker-flockig mit ADDRESS 
„.MAXONPASCAL“ einleiten. Welche Anweisungen Ihnen dann zur Verfügung stehen, wird in den fol¬ 
genden Abschnitten dargesteilt. Zuvor soüten Sie aber noch erfahren, wie Sie das MaxonPASCAl. 
wieder loswerden, ohne Ihren Rechner booten zu müssen. Zum einen gibt es dafür die Anweisung 
„QUIE“. Das folgende kurze ARexx-Script entfernt also MPASCAL aus dem System: 

Addreas "MAXONPASCAL" (juit 

An dieser Stelle sehen Sie auch, daß Groß-ZKleinschreibung von Befehlen in .3Rexx generell egal ist. 

Andererseits reagiert MaxonPASCAL im ARexx-Modus auch auf die üblichen Abbruchsignale. Wenn 
Sie .MPASCAL aus der Shell ohne „run“ gestartet halxtn, genügt also die Tastenkombination 
<Ctrl> + <C>. Falls Sie „run“ verwendet haben, können Sie mit der Sheli-Anweiung „Status“ die 
Prozessnummer heraustinden und diesen Prozeß dann mit der„/)reflÄ’“-Anweisung abmurxen. 


2. MaxonPASCAI. 


39 


2.6.3 Die ARexx-Befehle 

2.6.3.1 Schließen, öffnen und Beenden 

Wie bereits in 2.6.2 erläutert, kann M;ixunPASC.4L cluich die Anweisung quit beendet werden, sbut- 
down scblicllt alle Fenster, die MaxonP.ASCAL gerade geöffnet hat, z. B. weil das ganze System 
Iconifizert werden soll. AnscblieKend können mit reopen alle zuvor geöffneten Fenster erneut geöff¬ 
net werden. 

2.6.3.2 Übersetzen, Starten und Ähnliches 

Die ARexx-Befehle von MaxonPASCAl. entsprechen im wesentlichen den Anweisungen, mit denen 
normalerweise Edward den Compiler steuert (also über ,.Send/\ppConm‘') und die folglich auch in 
der „.DEF"-Datei verwendet werden. Allerdings haben einige Anweisungen hier .Argumente, die zum 
Teil aber optional sind. So auch bei der wichtigsten Anweisung überhaupt; „compile“. „compile hel- 
h.p“ veranlagt MaxonPASCAl., das gewohnte Compiler-Fenster zu öffnen und die Quelldatei ..hel- 
lo.p“ zu übersetzen. ARexx-Neulinge sollten lieachten, daß die Anführungszeichen in diesem Fall 
notwendig sind, damit ARexx „compilc“ und „helio.p“ als Teile einer zusammengehörentlen 
Anweisung versteht und vollständig an MaxonPASCAl, sendet. 

„compile“ ohne Dateinamen bewirkt die Compilation einer Datei namens „default.p“ - falls vorhan¬ 
den, Im .Make-.Modus (auch den gibt es natürlich im .ARexx-Modus) werden die Dateinamen aller¬ 
dings generell ignoriert und es wird stur nach der Make-Datei gearbeitet. 

Die .Anweisung nin startet ein ülxasetztes Programm, falls ein solches vorliegt. Im Gegensatz zur 
..normalen“ Entwicklungsumgebung wird dabei nicht automatisch compiliert, und es wird erst recht 
nicht geprüft, ob eine erneute Überstzung (z. B. w'egen Veränderung von Quelltexten) nötig w'äre. 

Ein mit „run“ gestartetes Programm kann mit der Anweisung break brutal abgebrochen werden. 
dehiip startet in gewohnter Weise den Debugger. 

2 . 6 . 3.3 Requester und Informationen 

Auch unter ARexx müssen Sie nicht darauf verzichten, die zahlreichen Optionen und 
Einstellmöglichkeitcn des Systems über Dialogfenster zu wählen: opsys öffnet das System- 
Dialogfcnster und opcomp öffnet das Dialogfenster für die Compiler-Optionen. Das Info-Fenster 
können Sie sich mit der Anweisung itifo ansehen, und nach einen Compilerdurchlauf läßt sich das 
bereits geschlossene Compiler-Fenster (in dem eventuell Fehlermeldungen stehen) mit der 
Anweisung errors erneut öffnen. 

2.6.3.4 Make 

Die Projektverwaltung steht auch im Re-xx-Modus zur Verfügung. Joacimk <üateiname>“ lädt die 
angegebene Make-Datei. Wenn der Dateiname weggelassen wird, öffnet sich das 
Dateiau.swahlfenster, und der Benutzer kann selbst eine Datei auswählen. Dagegen wird bei newmk 
stets eine vom Anwender zu benennende neue Projektdatei angelegt. Es ist nicht möglich, hier 
einen Dateinamen als .Argument zu übergeben, leavemk vergißt die geladene Make-Datei und schal¬ 
tet wieder in den Normal-Modus. 



MaxonPASCAL 


40 


Zur Manipulation von Projekten stehen nur die k'iden Funktionen zur Verfügung, die sielt sinnvoll 
von einem Editor aus starten lassen: „ackitx <Quelllextname>“ fügt eine neue Quelltextdatei hin¬ 
zu, vind „addtxohj <Quelllexlnmw>" trägt eine Quclltextdatei samt passender Objektdatei und 
geeigneter Compilcranweiung in die Make-Datei ein. Dabei werden natüiiicb auch auf „.asm“ 
endentic Quelltexte sinnvoll behandelt. 

Alle anderen Operationen kann der .Anwentler über das .Make-Dialogfenstcr vomebmen. Es wird mit 
openmake geöffnet. 

2.6.3.5 Schreiben von Dateien 

Mit „exefile <Dateinmne>'‘ wird - falls ein übersetztes und gelinktes Programm vorliegt - eine aus- 
fübiitare Programmdatei geschrieben, während „objeetflie <Dateiname>“ eine linkbare 
Objekttlatei sebreibt. Bei beiden Anweisungen ist der Dateiname optional. Wird er weggela.ssen, öff¬ 
net sieh das Dateiauswahlfenster. 

2.6.3.6 Optionen speichern und setzen 

Die beiden Anweisungen „m>ecoiif <Datehuime>“ „savesession <Dateiname>“ sebreiben alle 
Einstellungen in die angegebene Datei. Der einzige linier,schied ist der Default-Name, den die 
Anweisungen verwenden, wenn kein Dateiname angegeben wird - dies sind nämlich ,,S:mp.config'' 
und „mp.SESSION“, Systemeinstellungen können aus einem ARexx-Script aber auch beliebig gesetzt 
werden. Dazu tlicnt die Anweisung „selopt <Optkmen>“ Als Argument ist eine beliebig lange 
Folge vtm Einstellungen erlaubt. Die.se sintl in dem Format anzugeben, in dem sie in dei' Konfig- 
und in tien Session-Dateien stehen. 


"setopt -X21,"hello World!" -pp -b -X10,l" 

setzt tIen Argumentstring für Programmstarts auf,,hello World!'' und schaltet als Default in tIen 
Pascal-Modus, aktivert die Erzeugung von Debug-Dateien und läßt bei jetler Übersetzung automa¬ 
tisch eine Exe-Datei schreiben. 

.Alle Optionen, die die Entwicklungsumgebung betreffen, werden mit einer mit „-X“ beginnentlen 
Atiweisung eingestellt und werden in Abschnitt 2.5.4 dieses Handbuchs erläutert. 

2.6.3.7 Informationen über die Entwicklungsumgebung 

Für elegante I.üsungen sollten Scri|H,s auch in der Lage sein, Informationen über den aktuellen 
Status von MaxonP.ASCAI. zu erhalten. ..gelinfo AbWi" liefert den Namen der momentan geladenen 
Make-Datei bzw. einen l,eerstring. Mit „gelinfo Sl’ATE“ erhalten Sie einen String „NONE“, „COMPI- 
LED“ oder „LINKED“ und können so feststellen, ob ein übersetztes bzwe ül)ersetztes und gelinktes 
Programm vorliegt. In beiden Fällen liegt er Ergebni.sstring nachher in der Variablen „RESULT“. Es 
ist atich zu beachten, daß vorher mit der ARexx-Anw'cisung Options restdls die Daten Übergabe von 
MaxonPASCAL in das ARexx-Programm ermöglicht wurde. 



2. MiLxonPASC^VI- 


41 


2.6.3.8 Fehlermeldungen und Fehlerstellenansprung 

Die Anweisung „etToi’scripl <äiiteinaine>“ legt ein ARcxx-Script fest, das von MaxonPASCAl^ 
jedesmal aufgeaifen wird, wenn der Coni|riler eine Fehlermeldung ausgibt. Diesem Script werden 
als Argumente Dateiname, Zeilen- und Spaltennummer sowie die eigentliche Feltlermeldimg über¬ 
geben. So veranlaßt „eirorscripl eirors.i'X“ MaxonPASCAI. tei jedem folgenden Compilerfehler zu 
einem Aufruf der Art: 

rx errors.rx "hello.p" 8 1 "Syntax Error" 

Ihr Script „errors.rx“ kann dann mit den übergebenen Daten beliebiges tun, z.B. sie in einer 
Fehlerdatei altspeichern. 

Ein „errorscript“-.Aufruf ohne Argument schaltet diesen Aufrufmechanismus wieder ab. 

Da die Fehlerdaten schlicht an das Argument von „ernmaipt" angchängt w^erden, können Sie 
trickreich auch w'eitere Argumente an das ARexx-Script übergeben: 

"errorscript wagga.rx ERRORS argl! bläk" 

bewirkt Aufrufe wie 

rx wagga.rx ERRORS argll bläk "hello.c" ... 

Analog funktionicTt die Anweisung „editscripi < Script naiTic>", die dafür gedacht ist, auch im 
Rexx-Motliis Fehlerstellenansprung zu realisieren. Das angegebene Script wird aufgerulen, wenn der 
Benutzer im Compiler-Fenster nach Ansprung einer Fehlerposition verlangt, und erhält als 
■Argumente Dateinamen, Zeilen- und Spaltennummer, z, B.: 


rx edit.rx "hello.p" 8 1 



M;ixonPASCAL 


42 


3. Der Spezialist für viel Tipparbeit 


Durch die Beispiele im vorhergehenden Kapitel haben Sie sicher auch schon den neuen Editor von 
MaxonP.ASCAL kcnncngelernt. Einige Funktionen sind Ihnen bereits bekannt andere lassen sich 
unschwer erraten, wenn Sie mit der Maus in tlie Programm-Menüs blättern. 

Im Kapitel 2.2 haben Sie bereits ülx;r den Preprozessor des Editors gelesen, der die sehr komforta¬ 
ble Konfiguration (Fehlermeldungen, Tastatuitelegungen, Menüs und die bedingten Menüs) des 
Editors aus einer Datei intepreiiert. Die im folgenden beschriebenen Menüfunktinnen, Menü- 
Tastattirkürzel und besondere Prüffunktionen sind Bestandteil der dem Paket fliegenden 
Konfigurationsdateien und können von Ihnen jederzeit auf spezielle Bedürfnisse angepaKt werden. 
Eesen Sie näheres zur grundlegenden Bedienung und zur individuellen .Anpasstmg in den folgenden 
Kapiteln. 

3.1 Installation von Edward auf der Festplatte 

Etlward wird firn Installiemn des MaxonPASCAL-Compiler-Systems auiomatiseh mitinstalliert. 

3.2 Aufruf von Edward 

Je nachdem, was Sie bevorzugen, läßt sich Edward sowohl aus dem CU als auch von der Workbeneh 
aus starten. Für die fortgeschritteneren .Anweiulern ist hierbei vor allem interessant, welche 
Parameter schon beim Start an Edw'ard übergeben werden können. 


Hinweis 
















In Zusammenarbeit mit dem PASCAL-Compiler muß der Editor nicht extra gestartet 
werden. Dies übernimmt der Compiler für Sie. Lesen Sie die beiden folgenden 
Abschnitte, wenn Sie EDWARD auch unabhängig von MaxonPASCAL anwenden 
möchten. 


3.2.1 Start von der Workbeneh 

Mn einfachsten starten Sie Edward durch Doppelklick auf sein Icon. Dieses befindet sich nach einer 
normaien Installation im Verzeichnis „Edward:“ auf der von Ihnen gewähiten Partition Ihrer 
Festplatte oder auf der Diskette. 

Sie können Edward ebenfalls starten, wenn Sie auf das Icon einer mit Edward bearbeiteten Datei 
geklickt haben. 



43 


3. EDWARD 


Hinweis 


Wie Sie Icons zu einer Datei erzeugen lassen können und was es dabei zu beachten 
gilt, lesen Sie im Kapitel 3.15 „Globale Einstellungen“, insbesondere sollten Sie hier 
die Bemerkungen zum „Icon Tool“ beachten, 


Wenn Sie mit j^edriiekter Shift-Taste die Icons verschiedener Dateien anwählen unti daraufliin 
Edward durch Doppelklick starten (Shift-Taste gedrückt lassen), so lädt Edward automatisch die von 
Ihnen angewählten Dateien ein. Ängezeigt wird Ihnen allerdings nur die letzte geladene Datei. 

"w Zum gleichzeitigen Bearbeiten verschiedener Dateien lesen Sie mehr im Kapitel 3-3 „Text“. 


3.1.2 Start aus dem CU 

Normalerweise starten Sie Edward v'on CIJ aus durch einfache Eingabe von „Edward . Falls Ihnen 
das zu lang ist, so benennen Sie Edward einfach um oder Sie benutzen den „Alias“-Befehl Ihrer Shell 
(Mehr dazu lesen Sie in der von Commotlore ausgelieferten Dokumentation oder in den entspre¬ 
chenden HotHelp-Projekten). Sie können selbstverständlich Namen von Dateien angeben, die nach 
dem Start von Edward automatisch geladen werden sollen. 

Nach dem Start von Edward aus dem CU erscheint die Meldung „Edward Process successfully deta- 
ched“. Das bedeutet, daß Edward von nun an unabhängig vom CU als eigener Prozeß läuft. Sie kön¬ 
nen weiter mit dem CU arbeiten, ohne daß dieser blockiert ist und können den CU auch jederzeit 
beenden. 

3.2 Eingabe und Bearbeitung von Texten 

Zu Beginn erläutere ich kurz die Bedeutung der Status-Anzeige, danach werde ich Ihnen die vorein¬ 
gestellte Tastaturbelegung erklären, so daß Sie alle üblichen Operationen tei der Eingabe eines 
Textes vornehmen können. Desweiteren werde ich noch zusätzliche Möglichkeiten vorstellen, wie 
Sie die Cursor-Position im Text verändern können. 


3.2.1 Die Status-Anzeige 

Wichtige Informationen über den gerade bearbeiteten Text erhalten Sie auf einen Blick, wenn Sic 
die Titelzeile eines momentan aktiven Text-Fensters von Edward betrachten. 

Ganz links erscheint dort immer iler Name des gerade bearbeiteten Textes. Anschließend folgen 
zwei Zahlenangaben, die erste gibt die aktuelle Zeile an, die zweite die Spaltenposition innerhalb 
dieser Zeile. 

Anschließend folgen fünf durch Komma getrennte Buchstaben. Diese geben an, ob bestimmte 
Optionen für den aktuellen Text aktiv sind, dann ist tler entsprechende Buchstabe groß, oder nicht 
(der Buchstabe ist dann logischerweise klein). 



MaxonPASCAL 


44 


Da.s „c“ ganz links gibt an, ob der Text seit dem Einladen oder nach dem letzten ,Abspeicbem verän¬ 
dert wurde (großes „C“ falls dies der Fall ist). 

Da.s „f“ gibt an, daß Falten geändert wurden. 

Ein großes „W“ bedeutet, daß der Text im „Word-Wrap“-Modu,s Ix-arbeitet wird. 

Ein „O“ gibt an, daß nun der „OverWrite“-Modus gilt und ein großes „L“ signalisiert, daß der Text 
momentan ge-‘'locked“ ist. Ge-“locked" bedeutet, der Text kann momentan nicht verändert werden. 
Dies ist zum Beispiel der Fall, wenn Sie den entsprechenden Text drucken lassen. 

■rsp Mehr zu den oben erwähnten Modi lesen Sie in den Kapiteln 3-8 „Das Edit-Prefs Formular“ und 
3.9 „VVord-Wrap“. 

3.2.2 BACKSPACE und DELETE 

Die'lasten <BACKSPACE> und <DElJilT> sind wie üblich belegt. Mit <CTRL>-t-<DELETE> 
können Sie die komplette aktuelle Zeile löschen. 

3.2.3 UndoLine-Funktion 

Edward bietet die Möglichkeit das Löschen einer Zeile oder Änderungen einer Zeile rückgängig zu 
machen, falls Sie nicht schon eine weitere Zeile verändert haben. 

• Geben Sie zum Test folgendes ein : „Der dumme Detlev demoliert die Damentoilette“. Fahren 
Sie nun mit dem Cursor auf „Detlev'" und ändern Sie den Namen in „Dödel“. Drücken Sie nun 
< CTRL > -l < U >. Daraufltin erscheint statt „Dödel“ wieder „Detlev“. 

• lÄschen Sie nun die komplette Zeile mit <C'rRL>+ <DELETE>. Mit <CTRL>-f <U> 
erhalten Sie die komplett gelöschte Zeile wieder zurück. 

3.2.4. RETURN, ENTER und TAB 

Falls Sie < RETURN > drücken und der Cursor befindet sich innerhalb einer Zeile, so wird die Zeile 
an dieser Position aufgespalten. Ähnliches gilt für <EN'rER>. Drücken Sie <RETURN> oder 

< ENTER > am Anfang einer Zeile, so wird vor dieser eine leere Zeile eingefUgt. Drücken Sie 

< RETURN > oder <EN'rER> am Ende einer Zxile, so wird nach dieser Zeile eine leere Zeile ein¬ 
gefügt. Der Unterschied zwischen <RE'rURN> und < ENTER > ist, dalS < ENTER > die neu 
erzeugte Zeile entsprechend der vorigen Zeile einrückt. Dies ist ein besonders für Programmierer 
nützliches Verhalten, das das strukturierte Programmieren unterstützt. 

Mit der <TAB>-Taste fügen Sie ein Zeichen in den Text ein, daß den Platz von 3 Leerzeichen ein¬ 
nimmt, Dies dient ebenfalls der besseren Strukturierung von Texten und Programmen. 

Die Veränderung der TAB-Weite wird im Kapitel 3.8 über das Edit-Prefs-Formular erklärt. 



3. EDWARD 


45 


Um die oben erkläiten Funktionen von <TAB> und <ENTER> zu testen, können Sie folgendes 
ausprobieren, 

• Drücken Sie dreimal die < TAB >-Taste. Wie Sie an der rechten Zahl in der Titel-Leiste des 
Fensters sehen, befindet sich der Cursor nun an der Position 10 im Text, Gehen Sie nun 

FOR V := ei TO e2 DO s; oder wus Ihnen beliebt ein. 

• Drücken Sie nun die <RNTF;R>-Taste. Sie befinden sich nun in einer neuen Zeile und der 
Cursor befindet sich wieder auf Position 10. also auf derselben Einriickungsstufe wie die vorige 
Zeile. 

3.2.5 Die Cursor-Tasten und der Ziffernblock 

Wenn Sie die CURSOR-Tasten ganz normal drücken, also nicht in Kombination mit <.ALT>, 
<CTRL> oder <S11IFT>, so bewegen Sie den Cursor wie gewohnt. Dies ist ebenfalls mit den 
Tasten des ZilTernblock möglich. Diese müssen Sie allerdings in Kombination mit tler <AL1 >-Taste 
tlriicken (ALT-8,4,6,2). 

In Verbindung mit <AI.T> bew'egen Sie sich mit <CLIRSOR-l.eft> und <CURSOR-Right> um ein 
W'ort vorwärts oder rückwiins. Mit <Cl)RSüR-i:p> untl <CURSÜR-Down> geht es jeweils vier 
Zeilen nach oben bzw. unten. 

Mit <SIIIFT> bewegen Sie den Cursor mit <CUKSOR-LcTt> und <CURSOR-Right> an den 
Anfang bzw. das Ende tler Zeile. In Verlrindung mit <CLIRSOR-Up> und <CURSOR-Down> 
bewegen Sie sich jeweils um fast eine Bildschirmseite nacli oben bzw. unten. 

Mit <,ALT-PgUp> (AI.T-9) untl <A].T-PgDn> ( M.T-3) des Ziffernblocks bewegen Sieden Cursor 
auf dieselbe Weise. 

Mit <Ai;r-Home> (M.T-7) und <iM;r-Rntl> (,Ai;f-l) des Ziffernblock springen Sie an den Anfang 
bzw'. tlas Entle des Textes, 

Benutzen Sie die Tasten <8> untl <2> des Ziffernblocks in Kombination mit der linken <,AM1- 
G.A-Taste>, so können Sie den Text um jew'eils eine Zeile nach oben aler unten scrollen. Dabei 
bleibt der Ctirstrr an seiner Position, untl tler Text verschiebt sich unter ihm in beide Richtungen. 


3.2.6 Der Schieberegler 

Sie können die Position tles Cursors im Text ebenfalls mit tlem Slider an der rechten Seite des 
Textfenster bestimmen. Wenn Sie vor oder hinter den Slider klicken, bew'egen Sie den Cursor 
immer um eine Seite vor oder zurück. 


3.2.7 Die Maus 

Es ist zusätzlich möglich, den Cursor mit der Maus an eine bestimmte Ptisition zu bewegen. Dazu 
bewegen Sie einfacit den Mauspfeil auf die gew'ünschte Position und drücken die linke Maustaste. 



MaxonPASCAL 


46 


Solange Sie die linke Maustaste gedrückt halten, folgt der Cursor dem Mauspfeil, Bewegen Sie sich 
an den oberen oder unteren Rand des Fensters, so scrollt der Text in die entsprechende Richtung. 
Die Geschwindigkeit, mit welcher dieser Vorgang abläuft, hängt davon ab, ob sich der Mauspfeil 
ganz rechts - dies entspricht einer sehr langsamen Bewegung - oder ganz links - dies entspricht 
einer sehr schnellen Bewegung, - befindet. 

3.3 Text 

Ein Text besteht einfach aus einer oder mehreren Zeilen, die Sie eingeben oder als Datei von 
Diskette oder Festplatte geladen haben. 

i®- Das Laden von Dateien (=Texten) finden Sie im Kapitel 3.4 „Dateioperationen.” 

Mit Edward können Sie fast beliebig viele Texte im Speicher halten, zwischen diesen umschalten 
und (natürlich :■)) die Texte bearbeiten. 

3.3.1 Erzeugen von Texten 

• Starten Sie bitte den Pascal-Compiler oder einfach nur den Edward. 

Edward hat automatisch alles Nötige unternommen, damit Sie sofort einen Text oder ein Programm 
eingeben können. 

• Tippen Sie nun - Mein 1. Text mit Edward - ein. 

• Wir werden jetzt Edward mitteilen, daß wir einen weiteren Text bearbeiten wollen. Dazu wählen 
Sie aus dem „Text“-Menü den Eintrag „Neu“. Das Fenster von Edward ist daraufhin wieder leer. 
Das ist richtig, denn Sie befinden sich jetzt im zweiten Text, für den Sie eben Speicher reserviert 
haben. 

• Tippen Sie nun - Mein 2. Text mit Edward-ein. 

Mil dem oben beschriebenen Menüpunkt köfincn Sie jederzeit Edward mitteilen, daß Sie einen wei¬ 
teten Text bearbeiten wollen. Verfahren Sie wie oben beschrieben und erzeugen Sie einen dritten 
Text und geben daraufhin - Mein J Text mit Edward - ein. 

3.3.2 Wahl eines bestimmten Textes 

Um wieder zurück zum ersten Text zu gelangen, gibt es verschiedene Möglichkeiten, 

• Wählen Sie den Eintrag „Vorheriger“ aus dem Text-Menü. Edward zeigt Ihnen nun die Zeile 
„Mehl 2. Text mit Edward" an. Mit „Vorheriger“ wählen Sie immer den vorigen Text aus. 

• Wählen Sie erneut den Eintrag „Vorheriger“ aus dem Text-Menü. Edward zeigt Ihnen nun die 
Zeile „Mein 1. Text mit Edward“ an. Wir befinden uns also jetzt, wie gewninscht, wieder im 
ersten Text. 


47 


3. EDWARD 

• Wählen Sie noch einmal den Eintrag „Vorheriger“ aus dem Text-Menü. Edward zeigt Ihnen die 
Zeile „Mein 3. Text mit Edward“ an. Vor dem ersten Text kann natürlich kein weiterer liegen. 
Darum wählt Edward in diesem Fall den letzten Text. Sie können also mit „Vorheriger die 
'l'exte der Reihe nach anwählen. 

Genauso können Sie tlurch Wählen von „Nächster“ im „Text“-Menü den folgenden Text anwählen. 
Haben Sie gerade den letzten Text bearbeitet, so wählt Edward in diesem Fall den ersten Text. 

• Eine direkte Wahl des Textes ist ebenfalls möglich, Möchten Sie den zweiten Text bearbeiten, 
dann wählen Sie einläch „Text 2“ aus dem „Text“-Menü. 


3.3.3 Freigeben eines Textes 

Nach der Bearbeitung eines Textes (und dem .Mrspeichern desselben) können Sie Edward mitteilen, 
daß Sie diesen Text freigeben möchten. 

• Wählen Sie „Löschen“ aus dem „Texf'-Menü. Edward zeigt Ihnen daraufhin die Zeile „Mein 3. 
Text mit Edward“ an. Der zweite Text wurde von Edward freigegeben. Nach der Freigabe eines 
Textes versucht Edwaril, den tolgenden zu w'ählen. Haben Sie den letzten Text freigegeben, 
dann wählt Edward den vorigen Text für die weitere Bearbeitung aus. 



Sollten Sie aus Versehen die Freigabe eines Textes eingeleitet haben, der noch nicht 
abgespeichert wurde, so erscheint ein Dialogfenster mit der Frage, ob Sie diesen 
Text „vergessen“ wollen. Geben Sie „Nein“ an, so wird die Operation abgebrochen, 
wählen Sie „Ja“, dann gehen alle Änderungen, die an diesem Text vorgenommen 
wurden, verloren! 


3.3.4 Löschen des aktuellen Textes 

Mit dem Eintrag „Entfernen“ aus dem „Texf-Menü können Sie alle Zeilen des aktuellen Textes 
löschen und danach einen neuen Text eingeben. Der Text wird dadurch aber nicht freigegeben. 


3.3.5 Drucken eines Textes 

Mit dem Eintrag „Drucken“ aus dem „Projekt“-Menü teilen Sie Edward mit, daß er den Text, den 
Sie momentan bearbeiten, ausdnicken soll. Während Edward diesen Text druckt, können Sie weiter¬ 
hin andere Texte bearbeiten und desweiteren alle Funktionen von Edward benutzen, die den aktu¬ 
ellen Text nicht verändern. Sie können also, während Edward Ihren Text druckt, weiterhin in die¬ 
sem den Cursor positionieren oder z.B. Blöcke markieren und kopieren. Das Einfügen oder 
Ausschneiden von Blöcken ist dagegen nicht möglich. 




MaxonPASCAL 


48 


W'ährcnd des Druckvorgangs erscheint ein kleines Fenster. Wenn Sie den Dmckvorgang unterbre¬ 
chen wollen, so schlie(:ien Sie einfach dieses Fenster. 

Das Format, in welchem eine Textseite gedruckt werden soll, können Sie auf vielfältige Weise 
variieren. Lesen Sie dazu niehrim Kapitel 3.IS „Globale Einstellungen“. 


Hinweis 


Edward gibt den Text an den Drucker aus, den Sie mit den Preferences der 
Workbench gewählt haben. Sollten Sie hiermit nicht klarkommen, so schauen Sie im 
Handbuch zur Workbench nach, das zu jedem Amiga mitgeliefert wird. 

3.4 Dateioperationen 

Hinter dem hochtrabenden Titel „Dateioperationen” verbergen sich Funktionen zum 
Abspeichern tintl kiden von Texten. 


3.4.1 Speichern von Texten 

■Nachdem Sie im ersten Kipitel gelernt haben, wie man einen Text eingiht und bearbeitet, zeige ich 
Ihnen nun. wie man einen solchen Text auf Diskette otler Festplatte ahspeichert und wie man den 
Text von dort zur Bearbeitung wieder in den Editor bekommt. 

Lieben Sie nun einen beliebigen Te.xt ein, z.B.: „AllesSeiende hal sein Sein im Nichl-Sein seines 
Gegensatzes. “ 

Wählen Sie aus dem „Projckf-Menii den Eintrag „Speichern als...“. Es erscheint daraufliin ein 
Dateiauswahlfenster, in tlessen Titelzeilc „Text speichern“ steht. Speichern Sie den Text unter 
dem Namen „Test.TXT“ ab. 

Normaleixveise wird laeim Altspeichern eines Textes für diesen ein Pictogramm erzeugt, so claK er 
auch aut der Vl'orkbench sichtbar wird. Desweiteren werden einige Zusatzinformationen, die den 
Text betreffen niitabgespeicbert (unter anderem die Tabulatorweite, Textlälten, etc. ). Besonders 
interessant ist hierbei, dalS Etlward auch die aktuelle Cursorposition speichert. Das bedeutet, wenn 
Sie einen le.xt emeut einladen, dann befindet sich der Cursor an derselben Stelle, an der Sie zuletzt 
gearbeitet haben. 


Das Erzeugen des Pictognimmes und das Speichern der Zusatzinformationen können Sic natür¬ 
lich auch abstellen. Lesen Sie hierzu das Kipitel 3.15 „Globale Einstellungen“. 


1 Hinweis 










Unter Umständen erscheint ein „System Request“ mit dem Hinweis, das Ihre 
Diskette schreibgeschützt ist. Sorgen Sie dann dafür, das der Schreibschutz entfernt 
wird oder nehmen Sie eine andere Diskette. 



3. EDWARD 


49 



Die Bedeutung des Abspeicherns kann gar nicht oft genug betont werden. Alle 


Veränderungen, die Sie seit dem letzten Abspeichern vorgenommen haben, sind ver¬ 
loren, wenn ein System-Absturz auftritt, der Strom ausfällt oder sonstige unvorher¬ 
sehbare Ereignisse eintreten. Sie können durch eine spezielle Einstellung dafür sor¬ 
gen, daß Edward In bestimmten Zeitabschnitten Ihre Texte automatisch abspeichert, 

Prcfs/Autosave 


3.4.2 Laden von Texten 

Nachdem Sie nun einen Text abge,speichen haben, zeige ich Ihnen im Folgenden wie Sie diesen 
Text wieder einladen. 

• Wählen Sie aus dem „Text“-Menü den Eintrag „Entfernen“. Das Textfenster i.st nun leer. .Alle 
Textzeilen wurden freigegeben. Dies ist nur für un.ser Beispiel notwendig. 

• Wählen Sie nun ilen Eintrag „Öffnen“ aus tlem ,,Projekt''-Menü. Es erscheint wie vorher laeim 
Abspeichern der Dateiauswahlfenster, ln diesem Fall steht in seiner Titelzeile aber „Text laden“. 
Inden Sie den Text „Test.TXT“ wietler ein. 


Hinweis 






Wenn Sie einen Text einladen, wird dieser über den Inhalt Ihres aktuellen Textes 
geladen. Wenn Sie dies vermeiden wollen, so sollten Sie zuerst einen neuen Text 
erzeugen, bevor Sie „Öffnen“ wählen. Sollte der aktuelle von Ihnen bearbeitete Text 
noch nicht gespeichert worden sein, so erscheint ein Dialog-Fenster, das Sie auf die¬ 
sen Umstand aufmerksam macht und mit dem Sie das Überladen dieses Textes ver¬ 
hindern können. 


3.5. Blockoperationen 

Gröbere Teile eines Textes umgruppieren oder vcrviclEiltigen zu können, ist eine der wichtigsten 
Fähigkeiten eines Editors. Edward bietet Ihnen auch auf diesem Gebiet alles Nötige und einiges dar¬ 
über hinaus. 

Ein besonders markierter Bereich eines Textes wird im tillgemeinen als ..Block" bezeichnet. Daraus 
leitet sich auch der Name dieses Ka[)iiels ab. 


3.5.1 Cut, Copy, Paste 

Hinter den Begriffen .Ausschneiden“, „Kopieren“ und „Einfügen“ verbergen sich die elementa¬ 
ren Blockt tperationen. 




MaxonPASCAI. 


5Ü 


Mir .Ausschneiden“ schneiden Sie einen markierten Block aus Ihrem Text aus und speichern ihn 
in einem Zwischenspeicher ah. „Kopieren“ kopien den Block nur in den Zwischenspeicher, oline 
üin auszuschneiden und „Einfügen“ fügt den Block ab der aktuellen Cursor-Position in den Text 
ein. 

Um eine Blockoperation ausführen zu können, mü.ssen Sie zuerst einmal einen Block markieren. 
Dies geschieht indem Sie „Markieren“ aus dem ,,Block‘‘-Menü wählen. Wenn Sie nun den Cursor 
bewegen, so werden Sie feststellen, daß der gesamte Textbereich zwischen der Position an der sich 
der Cursor momentan befindet und dem Ort, an dem sich der Cursor befand, bevor Sie 
„Markieren“ gewählt haben, invertiert dargestcllt wird. Dieser invertiert dargestellte Bereich ist der 
sogenannte markierte „Block“. Alle Blockoperationen wirken sich auf diesen Bereich aus. 

Wenn Sie erneut „Markieren“ wählen, wird der gesamte Text wieder nnnnal ilargestellt. Der mar¬ 
kierte Block wurde damit veigessen. 

• Für tlie folgenden Schritte sollten Sie nun einen etwas längeren Text einladen. 

• Positionieren Sie nun den Cursor in die .Mitte irgendeiner Zeile am Aifang ties Textes und 
w'ählen Sie danach „Markieren“ aus dem ..Bk)ck“-Menü. 

• Fahren Sie nun mit dem Cursor in irgendeine Zeile, die weiter unten liegt. Sie sehen nun einen 
invertiert dargestellen Bereich. 

• Wählen Sie „Ausschneident“ aus dem „Block"-Menii. Der markierte Bereich verschwindet dar¬ 
aufhin. Der Cursor befindet sich nun auf derselben Position, an der er sich befand, bevor Sie 
„Markieren“ gewählt hatten. Rechts vom Cursor befindet sich der Rest der Zeile, auf tier sich 
der Cursor befand, bevor Sie .Ausschneiden“ gewählt hatten. 

Um nun die ursprüngliche Gestalt des Textes wiederhcr/ustcllen, können Sie den ausgeschnittenen 
Bereich wieder in den Text einfügen. Dazu dürfen Sie den Cursor nicht bewegen. 

• Wäfiien Sie „Einfügen“ aus tiem ,.Block“-.Menü. Der Cursor l'tefindet sich nun am Encfe des ein- 
gefügten Bereiches. Ihr Text hat wieder seine ursjrrüngliche Gestalt. 

Sie können jederzeit an anderen Positionen im Text eine Kopie des au.sgeschnittenen Bereiches cin- 
fügen, indem Sie einfach ..Einfügen“ anwählen. 

Wenn Sie einen bestimmten Textbereich nur kniüercn wollen, so markieren Sie den Bereich, 
wählen „Kopieren“, positittnieren den Cursor an die gewünschte Stelle und wählen danach 
„Einfügen“. 

Zum Zwischenspeichern von Textausschnitten bedient sich Edward des Zwischenspeichers. 
Dies ist eine genormte Ablage, der sich alle Programme, die für den Amiga entwickelt werden, 
bedienen sollten. Falls Sie zum Beispiel ein Desktop-Publishing Programm besitzen, aber nicht 
auf die komfortablen Editier-Möglichkeiten Edwards verzichten w'ollen, so können Sie sich des 
Zwischenspeichers bedienen, um Texte zwischen Edward und dem DTP-Programm auszutau¬ 
schen. Dabei ist natürlich Voraussetzung, daß das DTP-Programm ebenfalls den 
Zwischenspeicher unterstützt. 



3. EDWARD 


51 


3.5.2 Spaltenblöcke 

Eine Besonderheit im Umgang mit Blöcken bietet Ihnen Edward mit den Spaltenblöcken. Haben Sic 
zum Beispiel eine Tabelle mit mehreren Spalten eingegeben und Sic wollen nun eine der Spalten 
kopieren oder vertauschen, dann bewerkstelligen Sie dies unter Zuhilfenahme von Edw'ards 
Spaltenblöcken. 

• Geben Sie folgende Tabelle ein 


Film 


Bewertung 


Hauptdarsteller 


ITest 


Allen I 

1- 

Slgourney Weaver 

Allen II 

1 

Slgourney Weaver 

Terminator II 

1++ 

Arnold Schwarzenegger 

Homo Faber 

1 

Saun Shephard 

Gefährliche Liebschaften 

1 + 

John Malkovlc, 

Glenn Close, 

Michelle Pfeiffer 

The Pabulous Baker Boys 

1 

Michelle Pfeiffer, 
Jeff & Beau Bridges 

Das Russlandhaus 

2 

Sean Connery, 

Michelle Pfeiffer 

Harry & Sally 

1 

Meg Ryan 

Night on Earth 

1 

Wynona Ryder 

Fessle mlchl 

1 

- 

Das Wunderkind Tate 

2 + 

Jodle Foster 

König der Fischer 

2 + 

Robin Williams 

Hook 

e 

Dustin Hoffmann, 

Robin William, 

Julia Roberts 


Sie wollen nun die Spalte „Bewertung“ mit der Spalte „Hauptdarsteller“ vertauschen. 

• Fahren Sie mit dem Cursor auf das B von ..Bewertung“. Wählen Sie dann „vertikal markieren“ 
aus dem „Block“-Menü. 

• Bewegen Sie nun den Cumor vor das R von „Robin Williams“ in der letzten Zeile, Spalte 
„Hauptdarsteller“. Wählen Sie anschließend .aVusschneiden“ aus dem „Block“-Menü. Die 
Spalte ..Bewertung“ ist nun verschwunden, „Hauptdarsteller“ befindet sich an deren Stelle. 

• Positionieren Sie den Cursor auf das Ausimfungszeichen in der ersten Zeile der Spalte „Test“. 
Wählen Sie nun „vertikal einfügen“ aus dem „Block“-Menü. 

Daraufliin erscheint die Spalte „Bewertung“ wieder. Die Vertauschung hat funktioniert. 


3.5.3 Laden, Speichern und Drucken 

Sie können einen mit .Ausschneiden“ oder „Kopieren“ in die Zwischenablage kopierten Block 
auf einfache Weise als Datei abspeichern. Dazu w'ählen Sie einfach „Block speichern“ aus dem 




MaxonPASCAL 


52 


„Blück‘’-Meiiü. Es erscheint der Dateiauswahifenster und Sie können einen Namen für tien Block 
angeben. 

Wollen Sie einen so abgespeicherten Block wieder in Ihren Text einfügen, so wählen Sie „Block 
einiesen" aus dem „Block“-Menü. Mit dem Dateiauswahlfenster geben Sie eine Datei an. Daraufhin 
wird die angebene Datei in den Zwischenspeicher geladen. Sic können sie dann jederzeit mit 
„Einfügen“ an einer beliebigen Stelle im Text einfügen. 

Mit dem Menlipunkt „Block drucken“ aus dem .,Block“-Menii können Sie einen in die 
Zwischenablage gespeicherten Block ausdrucken, allerdings ohne dieAusgalxt besonders zu forma¬ 
tieren. wie es beim Ausdruck eines ganzen Textes geschieht. 


3.5.4 Einrücken 

Zur Strukturierung von Texten, insbesondere von Programmen, dient das Einrücken von 
Textabschnitten, die damit als zusammengehöriger Abschnitt hen'orgchobcn werden sollen. Zur 
Unterstützung dieser .MalSnahmen bietet Ihnen Edward die Möglichkeit, einen markierten Bereich 
von Zeilen einzuriieken. 

• Geben Sie folgendes Programmfragment ein; 

WHILE Count >= 0 DO 

BEGIN 

s; 

v:sBucc(v); 
count:=count -1; 

END; 


Um den Bereich zwischen BEGIN und END besser hervorzuheben, können Sie ihn einrücken, 

• Bewegen Sie dazu den Cursor auf die Zeile nach BEGIN und wählen Sie .JMarkieren“ aus dem 
„Edit“-Menii. 

• Fahren Sie nun mit dem Cursor an das Ende der Zeile vor END. 

.Mit <CTId.> + <CursorLeft> und <CTRL> + <CursorRighi> können Sie nun den markierten 
Bereich um jew'eils einen TAB-Schritt nach rechts (xler links verschieben. 

• Drücken Sie <CTRL>-t-<Cur.sorRight>. Damit haben Sie den Block um eine TAB-Position 
nach rechts verschoben. Probieren Sie ruhig ein bißchen die Möglichkeiten aus, die sich mit 
dem oben beschriebenen Verfahren ergeben. 


3.5.5 Umwandeln in Groß- bzw. Kleinbuchstaben 

Mit zwei weiteren Funktionen können Sie alle Buchstaben eines markierten Blocks in Groß- bzw. 
Kleinbuchstaben wandeln lassen. 




3. KDWAltD 


53 


• Geben Sie ,.,3lles Seiende entsteht tihne Grund, setzt sich aus Schwäche fort und stirbt durch 
Zuläll.“ oder etwas was Ihnen mehr zusagt, ein, 

• Markieren Sie einen Block, der vom ersten Buchstalx'n von „Seiende“ bis zum letzten 
Buchstaben von „aus“ reicht. 

• Wählen Sie nun „Großbuchstaben“ aus dem „F„xtras“-Menü, Augenblicklich werden alle mar¬ 
kierten Buchstaben in Grol^buchstabcn umgewandelt. 

Wenn Sie „Kleinbuchstaben“ aus tlem „Extras“-Menü wählen, so werden entsprechend alle 
Buchstaben des markierten Blocks in Kleinbuchstaben gewandelt. 


3.6 Suchen und Ersetzen 

Suchen und Ersetzen von Zeichenfolgen in einem Text gehören zum Standardrepertoire eines 
Editors. Hier läKt Sie Edwartl natürlich nicht im Stich. 

Um Ihnen tkis Arbeiten beim Suchen und Ersetzen zu erleichtern, bietet Edward zwei lixtra-Fenster 
mit diversen Einstellmöglichkeiten an, über welche Sie die .'Vrbeiten beim Suchen und Ersetzen steu¬ 
ern. Da Sie in diesen Fenstern gewisse Eintragungen machen können, sprechen wir im folgenden 
von sogenannten „Formularen“. 


3.6.1 Das „Find‘‘-Formular 

Ztmi Suchen eines bestimmten Begriffes betlienen Sie sich des „Find“-Formular.s, 
Dieses erscheint, wenn Sie im Menü „Suchen“ den Menüpunkt „Suchen ..." wählen. 




Jluc 








Jüttdcaril 

1 jjwiKe Mopt» i >1. i.i i 
j »uefc» jucfcwliipf '_ 


Wir wertlen nun gemeinsam die Funktionen des .,Find“-Formulars durchsprechen. 


Suchen 

ln tliesem Bereich geben Sie die zu suchende Zeichenfolge ein. Nach dem Öffnen eines Find- 
Formulars ist das Eingabefeld automatisch aktiv und zur Eingabe bereit. Wenn Sie die Eingabe 
mit RETURN abschliessen, so verschwindet das „Find“-Formular gleich darauf und tier Cursor 
wird auf die erste Stelle im Text positioniert, an der diese Zeichenfolge gefunden werden konn¬ 
te. 

Für die Suche einer Zeichenfolge gilt es dabei Folgendes zu Iveachten: 

Gesucht wird immer von der aktuellen Ctirsorposition aus. Normalerweise w'ird von dieser aus¬ 
gehend dann in Richtung auf das Ende des Textes hin gesucht. Konnte dabei keine 
Zeichenfolge im Text gefuitden werden, tlie der gewünschten entspricht, so wird die 
Suchrichtung umgekehrt. Jeder weitere Suchvorgang geht dann von der Cursorpo,sition aus 






MaxonPASCAL 


54 


zum Beginn des Textes hin, Wird dort niclits mehr gefunden, so kehrt sich die Richtung enieut 
um. 

mehrere Suchbegriffe 

Eine Besonderheit bietet Etiward Ihnen mit den beiden Knöpfen rechts neben dem 
Texteingabefeld. Sie können insgesamt 10 verschiedene Suchmuster eingeben. Mit den Pfeilen 
können Sie zwischen Ihnen umschalten. 

>Älldcard 

Hiermit können Sie beim Suchen sogenannte WildCards eingesetzen. .Als sog. Jokerzeichen 
dient dabei der Stern An jeder Stelle an der sich in der zu suchenden Zeichenfolge ein Stern 
befindet darf beim Vergleich mit einer anderen Zeichenfolge eine beliebige Teilfolge stehen. 
Geben sie zum Beispiel „Co^m^e“ als zu suchende Zeichenfolge ein, so wird beim Vergleich 
unter anderem „Commodore“ oder „Commttde" als gefunden erkannt. 

ignoriere Groß/Klein 

Wenn Sie „ignoriere GroK/Klein“ anwählen, so wird beim Suchen nicht zwischen Groß- und 
Kleinbuchstaben unterschieden. 

ganze Worte 

Ist dieses Feld angewählt, so wird nur nach vollständigen Wörtern gesucht. Wenn Sie also die 
Zeichenfolge „Kohl“ suchen, so gilt „Kühlsu[tpe“ oder „Kohldampf als nicht gefunden. Nur 
„Kohl“ wird gefutiden und der Cursor entsprechend positioniert. 

suche rückwärts 

Hiermit können Sie die Suchrichtung jederzeit umkehren. 

Suche nächsten 

Mit Klick auf dieses Feld positionieren Sie den Cursor automatisch auf das nächste Vorkommen 
der angebenen Zeichenkette. 

3.6.2. Das „Find & Replace"-Formular 

Mit dem „Find & Re|rlace“-FormuIar können Sie auf komfortable Weise Zeicbenfoigen im Text 
suchen und durch andere Zeichenfolgen ersetzen lassen. 



.: r...-...,.:.v.... . c.. ... f :|£D 

.. . . -viu. 

ii:uch«n i 

-- 

_ _ - w i V*! lanior-l^r“« firoß/Ktaln 





ftutrh# 

*r-»*txen f I* t 1 Stiche 


Die Bedienung des „Find & Replace“-Fürmular ist mit der des „Find''-Formular weitgehend iden¬ 
tisch. 


3. EDWARD 


55 


Suchen 

Geben Sic in dieses Texileld die zu siicliendc Zeichenrolge an. 

Ersetzen 

und in „Ersetzen“ tlie Zciclienfolge durcli welche ersetzt werden soll. Durch das Öffnen des 
„Finil 8i Replace“-Fürmulars ward automatisch das Eingahefeld „Suchen“ aktiviert. Nach der 
Eingabe in „Suchen“ wird automatisch „Ersetzen“ aktiviert. 

mehrere Such-ZErsetzbegriffe 

Mit den Knöpfen rechts neben „Suchen“ und ..Ersetzen“ können Sie zehn verschieden 
Suchmuster anwählen, mit zehn verschieden Zeichenfolgen durch die diese ersetzt werden sol¬ 
len. 

Vertauschen der Such-/Ersetzbegriffe 

.Ms weitere Komfortsteigerung können Sie mit Klick auf den Knopf rechts daneben die Such- 
und Ersetzungszeichenfolgen miteinander vertauschen. Falls Sie also aus Versehen zum Beispiel 
„Hund" suchen und durch „Katze“ ersetzeti ließen so können sie mit Hilfe dieser Funktion das 
Ganze rückgängig machen. 

suche nächsten 

.Mit Klick auf dieses Feld positionieren Sie den Cursor automatisch auf das nächste Vorkommen 
der in „Suchen“ angebenen Zeichenkette. 

ersetzen 

Durch Klicken auf dieses Feld wird von der aktuellen Cursor-Position aus die in ..Suchen“ ange- 
behene Zeichenfolge gesucht und, falls gefunden, durch die in „Ersetzen“ angebenene 
Zeichenfolge ersetzt. Danach wird automatisch das nächste Vorkommen des Begriffes in 
„Suchen“ gesucht und der Cursor darauf ptrsitioniert. 

ersetze alle 

Hiermit werden im gesatnten Text automatisch alle Vorkommen des in „Suchen“ angegebenen 
Textes durch denin „Ersetzen“ angegebenen Textes ersetzt. Anschließend wird der Cursor auf 
den Beginn des Textes positioniert. 


3.6.3 Struktur-Check (Klammer-Check) 

Für Programmierer (insbesondere diejenigen, die die Sprache „C“ benutzen ) kann der Strukur- 
Check sehr hilfreich sein. Mit diesem läßt sich auf einfache Weise prüfen, ob für jede öffnende 
Klammer in einem Ausdruck auch eine schließende Klammer vorhanden ist. Dabei werden nicht 
nur die gewohnten iimden Klammern „(“ und „)“ ülxirprüft, sondern auf Wunsch auch „[“ und „]" 
.sowie und „}“. 



MaxonPiiSCAL 


56 


• Gehen Sie folgende Zeilen ein : 


vold inain( void ) 

( 

int i; 

£or( i=100; i>0; i—) 

{ f( i & 1 ) 

{ print£( "%d\n", i*i+((3*i)-10/1) ); 
} 

} 

} 


• Positioniei en Sie nun den Curs(.)i' auf die öflnentle geschweifte Klammer in der weiten Zeile. 

• Nun wählen Sie „Strukturkontrolle“ aus dem „Suchen“-Menü. Der Cursor wird automatLsch 
auf die korrespondierentle schließende geschweifte Klammer in der letzten Zeile positioniert. 

• Wenn Sic erneut „Strukturkontrolle“ wählen, tiann wird der Cursor wieder auf die öffnende 
ge.schw'cifte Klammer in der zweiten Zeile gesetzt. 

Die Funktion „Strukturkontrolle“ versucht immer den Cursor auf die zur Klammer unter dem 
Cursor korrespondierende öflnendc oder schließende Klammer zu setzen. Sollte dies nicht möglich 
sein, so meldet Edw-ard „Structures do not niatch!“. Somit können Sie bei stark verschachtelten 
Funktionsblöcken in Ihren Programmen auf einfache Weise überprüfen, ob Sie zu jeder öffnenden 
auch eine schließende Klammer gesetzt babeti und Sie müssen nicht erst den Compiler bemühen, 
um solche leicht zu venneidenden Syntax-Fehler zu entiiecken. 

Mit tlen runden Klammern in der .sechsten Zeile des obigen Beispiels können Sie die Funktion 
„Strttkturkontrolle“ ausprobieren. Nehmen Sie ruhig einmal eine Klammer heraus und stellen Sie 
fest, wie Edward tiarauf reagiert. 

3.6.4 Compiler Error-Datei interpretieren, Fehler anspringen 

Eine Besonderheit von Edward ist, dtütl er die Fehlerdateien bestimmter Compiler auswerten kann. 
Sie müssen nur von Ihrem Compiler eine Fehlerdatei erzeugen las,sen und diese mit Edward laden. 
Die dafür nötigen Ftitiktionen können Sie zum Beispiel auf eine Taste oder ein Menü legen. Bei 
einem C-Compiler können Sie durch einlachen Aufruf von „CC >ErrorFile..." die Fehlermeldungen 
in die Datei „ErrorFile“ umleiten. Wenn Sie die Fehlerdatei geladen haben, so positionieren Sie den 
Ctirsor auf eine Zeile in der die Zeilennummer eines Fehlers steht. Danach wählen Sie „Gehe /u 
Fehler“. Daraulliin überprüft Edward, ob die Datei, zu der tlie Fchlerbeschreibung gehört, sich 
schon im S|teicher befindet. Ist dies nicht der Fall, so wird die entsprechende Datei nachgeladen. 
Daraufhin ward der Cursor auf tlie Zeile positioniert, in welcher sich der angebene Fehler befindet. 

Wenn Sie in einer geladenen Quelldatei einige Veräntlerungen vornehmen und dalxti Zeilen 
eitifügen oder löschen, so kann „Gehe zu Fehler“ natürlich nicht mehr auf die richtige Zeile 
positionieren. Sie .sollten tiaher immer die ungefähren Verschiebungen von Zeilen im Kopf 
behalten. 



3. EDWARD 


57 


3.6.5 Auf bestimmte Zeilen positionieren 

Mit „Gehe zur Zeile..“ öflncii Sie ein kleiiie.s Foniiular, in dem sofort ein Feld zur Eingabe einer 
Zahl bereit ist. Geben Sie die Nummer der gewünschten Zeile ein und drücken Sic <RET[IKN>. 
Daratifliin versucht Edward den Cursor auf die gewünschte Zeile zu [tositionieren. 

Mit „Gehe zum Anfang“ können Sie an tien Anfang eines Textes mit „Gehe zum Ende“ an das 
Emle eines Textes gelangen. 


3.7 Strukturieren von Texten, Lesezeichen 

Programme bestehen normalewcise aus Prozeduren, die in weitere kleine Einheiten strukturiert 
sind (oder zumindest sein sollten). Um ein Programm etwas übersichtlicher darstellen zu können, 
bietet Ihnen Edward das Konzept der Falten an. Desweiteren können Sie bestimmte Zeilen markie¬ 
ren. Mit den Cursor-Tasten lassen sich so bestimmte Strukturen einer Datei leicht anw'ählen. 
Ausserdem können wichtige Zeilen gemerkt und mit einem Tastendruck direkt angesprungen wer¬ 
den (Lesezeichen). 


Hinweis iiaiiBiiiaB 


Die Strukturierung eines Textes wird in der zum Text gehörigen Pictogramm-Datei 
abgespeichert. Näheres hierzu erfahren Sie im Kapitel 3.15 „Globale Einstellungen“. 

3.7.1 Erzeuge Falte, Zeige Falte, Entferne Falte, Zeige alle 
Falten, Schließe alle Falten 

Hinter dem Konzept der Falten verbirgt sich eine sehr leistungsfähige Methode zur Strukturierung 
von Programm-Quelldateien. 

• Geben Sie nun Ibigendes kleine Programm ein oder laiien Sie die Quelldatei eines von Ihnen 
erstellten Programms ein. 

Program Integration(input,output); 

{ Demonstriert Prozedur- und Funktionsparameter sowie Stringtypen } 


{ } 
{ Es werden die Quadratfunktion nach dem Trapezsummen- und die ) 

{ Sinusfunktion nach dem Simpsonverfahren in wählbaren Grenzen } 

{ integriert. } 


Type string20=array[1..201 of char; 

Function g(x:real):real; 

{ "Sqr" kann nicht direkt als Parameter übergeben werden. 

Grund: Der Ergebnistyp ist nicht definiert, sondern hängt vom 
Parametertyp ab (integer oder real). Dies gilt auch z. B. für 
"succ” und "pred". Solche speziellen Funktionen sind nicht als 
aktuelle Parameter erlaubt. } 

Begin 






MaxonPASCAL 


58 


g:=sqr(x) 

End; 

Procedure trap(Function f(x:real);real;a,b:real; niinteger; Var 
erg:real); 

Var B,h:real; i:integer; 

Begln 

h:=(b-a)/n; 
a:=0; 

For i:=l to n-1 do 
s! =B+f (a+i*h); 
erg:=(0.5*(f (a)+f(b))+B)/n 
End; 

Procedure simp(Function f(x:real>:real; a,b:real; nrinteger; Var 
erg:real); 

Var tl,t2:real; 

Begln 

trap(f,a,b,n, tl); { Beachte: eine Function, die "Bimp" alB 
Parameter ) 

trap(f,a,b,2*n, t2); { übergeben wurde, wird hier an "trap" 
weitergereicht. ) 

erg:=(4*t2-tl)/3 

End; 

Procedure Tabelle 

( funk, verf: string20; 

Function f(y:real): real; 

Procedure int 

( function f (y: real):real; 
xl,x2: real; 

a: integer; 

Var r:real 

) 

) ; 

{ Man beachte die tolle Schachtelung: Der Prozedurparameter "int" hat 
selbst wieder einen Funktionsparameter I } 

Var lo,hl,e:real; l,max!1..100; 

Begln 

writeln{"Integral der Funktion f(x)=",funk); 
writeln; 

write('Grenzen: ');readln(lo,hi); 
write('Anzahl: ');readln(max); 

page ; 

wrlteln('Integration von f(x)=',funk,■ durch ',verf,'verfahren'); 
writeln; 

For i:=l to max do 
Begln 

int(f,lo,hi,i,e); 
writeln(i:8,' ' ,e) 

End; 


3. EDWARD 


59 


writeln 

End; 

Begin { Hauptprogramm ) 

Tabelle< 'x*2■ , 'Trapez' ,g, trap) ; 

Tabelle("sin (x) ","Simpson", sin,simp) 

End. 

• Bewegen Sie den Cursor auf die erste Zeile der ersten Funktion. Wahlen Sie „Markieren" aus 
dem „Block“-Menü. Positionieren Sie den Cursor nun unter die letzte Zeile der Funktion. 

• Jetzt wählen Sie „Erzeuge Falte“ aus dem „Falte''-Menii. Alle markierten Zeilen bis auf die erste 
verschwinden nun. Vor dieser erscheint das Zeichen Der Cursor wurde ebenfalls auf diese 
Zeile bewegt. 

Damit halren Sie die erste Falte erzeugt. Alles, was vorher markiert war, steckt nun in der Falte. Nur 
die erste Zeile ist noch sichtbar. Ein besonderes Zeichen zeigt Ihnen den Beginn der Falte an. 

• Wahlen Sie nun „Zeige Falte“. Daraufliin wird tier Inhalt der Falte wieder sichtbar. Die Zeilen 
innerhalb der Falte beginnen mit dem Zeichen „ | “. Die letzte Zeile einer Falte wird durch das 
Zeichen kenntlich gemacht. 

• Wählen Sie erneut „Erzeuge Falte“, dann wird die Falte wieder „eingeklappt" und die vorher 
angezeigten Zeilen verschwinden. 

• Wenn Sie „Entferne Falte“ anwählen, so verschwindet die Markierung der gefalteten ersten 
Zeile, und alle „innereren" Zeilen der Falte erscheinen wieder. Diesmal allerdings unmarkiert. 
Die Faltung wurde vollständig rückgängig gemacht. 

'«■ „Zeige Falte“ und „Entferne Falte“ arbeiten nur, wenn der Cursor auf die erste Zeile einer 
Falte positioniert wurde. „Erzeuge Falte“ faltet einen markierten Block ein oder schliel.^t eine 
mit „Zeige Falte“ geöffnete Falte wieder. 

• Falten Sie nun alle Prozeduren aus unserem Beispiel ein. 

• Jetzt wählen Sie „Zeige alle Falten“. Daraufhin erscheinen beide gefalteten Bereiche so, alls 
wäre für jeden die Funktion „Zeige Falte“ aufgerufen worden. 

• Durch Wähl von „Schließe alle Falten“ wird das Ganze wieder rückgängig gemacht und nur 
die erste Zeile jeder Falte ist noch sichtbar. 

Mit „Entferne alle Falten“ entfernen Sie alle Falten aus Ihrem Text. 

Selbstverständlich lassen sich tlie Falten ineinander schachteln. Das bedeutet, das Sie mehrere gefal¬ 
tete Bereiche in einer übergreifenden Falte zusammenfassen können. 

Mit „Zeige innere Falten“ können Sie auf einen Schlag eine Falte mit all ihren inneren Falten öff¬ 
nen. „Schließe innere Falten“ macht dies rückgängig. 

Mit „Entferne innere Falten“ entfernen Sie eine Faltung inklusive all ihrer Unterfaltungen. 



MaxonPASCAL 


60 


3.7.2 Auszeichnen von Zeilen 

Bestimmte Zeilen eines Dokuments txler einer Quelklatei, die Sie mit Fdwartl bearbeiten, können 
Sie als besonders wichtig kennzeichnen. Diese Zeilen können auf besonders einfache Weise ange- 
sjrrungen werden. 

Eine Zeile wird durch die Tastenkombination <.A1,T> + <SHIFT> + <RETURN> ausgezeichnet. 
Die Zeile wird daraufhin mit einem führenden .Ausrufungszeichen dargestellt. Wiederholen Sie diese 
Tastenkombinaiion, so wird die Auszeichnung zuriickgenommen, und tias Ausrufungszeichen ver¬ 
schwindet. 

3.7.3 Cursor-Bewegung 

Mit zwei Tastenkombination können Sie gefalteten Zeilen sehr einfach anspringen. Mit 
<CTRL> + <CURSOR_UP> wählen Sie eine vor der aktuellen Zeile liegende Zeile an, die einen 
Faltenstan oder ein Faltenende darstellt. FJaenso können Sie mit <CTR1.> -f <CURSOR_DOWN > 
eine nach der aktuellen Zeile liegende Zeile anspringen. 

Mit <ALT>-f <SHlFT>-f <CURS0R_1:P> bzw. <ALT> + <S111FT> + <CURS0R_DÜWN> 
springen Sie eine vor bzw. nach der aktuellen Zeile liegende Zeile att, die Sie ausgezeichnet hatten. 


3.7.4 Lesezeichen (Bookmarks) 

fleiin Arbeiten mit einem Text kommt es oft vtrr, daß man schnell verschiedene, weit auseinander¬ 
liegende Positionen im Text anspringen möchte, an tienen man gleichzeitig adieitet (z.B. ich ati die¬ 
sem Handbuch). 

Eine .Möglichkeit um dies zu eneichen wäre, die entsprechenden Zeilen auszuzeichnen und dann 
mit den Cursor-Tasten anzuspringen, dies hat jedoch den Nachteil, daß man unter Umständen meh¬ 
rere Bew'-egungen im Text machen muß, um die gewünschte Stelle zu eireichen. 

ln diesem Fall gibt es aber eine weitere Besonderheit von Edward, die sogenannten ..Lesezeichen“. 
Mit der linken <ALT>-Taste und einer Zahlentaste des alphanumerischen Teils der Tastatur kön¬ 
nen Sie eine Zeile zwischenmerken. Wenn Sie nun an eine andere Stelle des Textes fahren unti die 
linke <.AMICiA>-Taste in Verbindung mit derselben Zahlentaste drücken, so springen Sie augen¬ 
blicklich an die alte Stelle im Text. 

Mit der Standartl-Tastaturbelegung Edwards können Sie zehn Lesezeichen benutzen, theoretisch 
erlaubt Ihnen Edward jedoch 65536 Lesezeichen pro Text. 

• Laden Sie eine Datei ein. 

• Drücken Sie die linke <.A1,T>-Taste untI die „1“. 

Es erscheint in der Titelzeile des Fensters tiie Meldung „.Markierung gesetzt“. 

• Fahren Sie an eine Ixtliebige andere Stelle des Textes. 



3. EDWARD 


61 


• Drücken Sie nun die linke <AM1GA>-Taste und wietier die „!“■ Und schwupps sind Sie wie¬ 
der an der alten Position int Texl. 


3.8 Das Edit-Prefs Formular 

Mit dem „Edil Prefe“-Fornuilar, tlas Sie durch Wahl von „Edit Prefs...“ aus dem „Text^^-Menü erhalten, 
können Sie für ieden Text den Sie mit Edward bearbeiten diverse Einstellungen vornehmen. 




Zaiflt SpaceatL’; L 

übarstet xfr' 

... 

IiX:_JSjTab UPljte 
i 60 ► iRechiter Rar 

-^3 ► (K lamriem; Ei 



Auto-Indent 

Wenn Sie .Auto-Indent aktivieren, wird bei der Stantlard-Tastaturbelegung auch nach DKicken 
der < RETURN >-Taste die neue Zeile entsprechend der alten eingerückt, wie es nach Drücken 
der <ENTER>-Taste tler Fall wäre. 

'c*' Siehe auch Kapitel 3.2 „Eingabe und Bearbeitung von Texten“ 

Word Wrap 

Durch Klick auf diesen Schalter wird tler ,,Word-Wrap''-Modus aktiviert, 
ir*- üljcr den „Word-Wrap“-.Miidus erfahren Sie mehr im Kapitel 3-9. „Word-Wrap“. 

Überschreiben 

Ist Überschreiben angewählt, dann überschreiben Sie jeweils das Zeichen auf dem der Cureor 
steht durch das neugetippte. Normttlerweise würde Edward das Zeichen einfügen. Überschrei¬ 
ben überschreibt dagegen die alten Zeichen. 

TAB in Spaces 

Ist diese 0|ttion aktiv, so wertien alle eingegeben T.ABs in einer Zeile automatisch in entspre¬ 
chend viele LeeKeichen umgewandell. 


















MaxonPASCAL 


62 


Zeige TABS 
Zeige Spaces 

Mit diesen drei Symbolen können Sie angeben, ob Tabs, Spaces und Zeilenenden einfach durcli 
Leerräume ciargestellt werden sollen (Normaleinsiellung) oder besonders gekennzeichnet dar¬ 
gestellt werden sollen, 

Übersetze CRs 

Dateien von anderen Comi^utersystemen enthalten unter Umständen ein zusätzliches Zeichen 
um ein Zeilenende anzuzeigen. Durch Aktivieren dieser Option wird ein solches Zeichen auto¬ 
matisch beim Laden des Textes entfernt. 

TAB Weite 

Tab Weite gibt die Anztihl von Zeichen zwischen zwei Tabularpositionen an. Sie können diesen 
Abstand im Bereich 1 bis 20 w'älrlen. 

Rechter Rand 

Mit Rechter Rand geben Sie die Position in einer Zeile an, ab der im „Word-Wrap“-Modus umge¬ 
brochen werden soll. 

Klammern Einzug 

Der hier eingetragene Wert gibt die Anzahl TABS an, die hei einem automatischen Einzug 
gesetzt werden. 

OK 

Wählen Sie USE, so werden die von Ihnen gewählten Einstellungen für den Text übernommen. 
Falls Sie „Rechter Rand“ geändert haben, so wird der komplette Text dementsprechend neu 
umformatiert und der Cursor danach auf die erste Zeile des Textes gesetzt. 

Abbruch 

Verwirft die von Ihnen vorgenommenen Einstellungen. 

3.9 „Word-Wrap" 

Zum Erstellen von Fließtexten, wie sie unter anderem für DTP-Programme benötigt werden, können 
Sie Edward in dem „W'oixl-Wrap“-Modus versetzen. „W'örd-Wrap“ bezeichnet ein spezielles Verhalten 
des Editors, bei dem eingegebene Zeilen beim Überschreiten einer bestimmten Länge umgebro¬ 
chen werden. Ein Wort, das mitten auf der Umbruchposition liegt, wird automatisch in die nächste 
Zeile gezogen. W'ird diese Zeile dtidurch ebenfalls zu lang, so wird das Ganze fortgesetzt und zw'ar 
bis an das Ende eines .Absatzes. 

Ein Absatz w'ird dadurch gekennzeichnet, daß Sie nach der letzten Zeichenfolge des Al^satzes 
<RETL'RN> drücken. Im Gegensatz zum normalen Editier-Modus von Edw'ard ist es im „W'ord- 
WTap“-Modus nicht notwendig, die <RETURN>-Taste zu drücken, um eine neue Zeile zu erhalten. 


3. EDWARD 


63 


Vielmelir erzeugt Edward automatisch beim Umbruch neue Zeilen. Sie brauchen also nur drauflos¬ 
zutippen. Daher stammt auch die Bezeichnung „Fließtext“. 

» Die IJmbruchposition wird durcli Angabe tles rechten Randes im „F.dit Prefs’‘-Formular angege¬ 
ben. Der „Word-Wrap‘'-Modus kann ebenl'alls durch dieses Formular ein- und ausgeschaltet wer¬ 
den. Wie Sie dabei vorgehen müssen, haben Sie im Kapitel 3.8. .,Das Edit-Prefs Formular“ gele- 


Im Gegensatz zu anderen Etlitoren, die einen Absatz erst durch Wahl eines bestimmten 
Menüpunktes einmalig umbrechen können, formatiert Edward den Text schon während der 
Eingabe. .Auch beim Löschen innerhalb eines Absatzes werden Worte aus folgenden Zeilen eines 
.Absatzes wieder nachgezogen, wenn in der aktuellen Zeile durch das Ixaschen Platz für sie gew'on- 
nen wurde. 

Neben dem automatischen Umbruch des „Word-Wrap“-Modus können Sie einen Text auch 
nachträglich umformatieren. 

Hierzu wählen Sie entweder „Format Paragraph“, um einen .Absatz neu umzubrechen oder 
„Format Text“, um den gesamten Text neu umzubrechen. Beide Menüpunkte befinden sich im 
„Flxtras“-Menü. 


3.10 Makros 

Eine Besonderheit von Edward, die Ihnen viel .Arbeit erleichtern kann, ergibt sich aus der 
Möglichkeit, Makros aufzeichnen und abspielen zu können. 

Fast alle Aktionen, die Sie beim Editieren eines Textes ausführen, können Sic wie mit einem 
Kassettenrekorder aufnehmen und bei Bedarf wiedergeben lassen. Das bedeutet, daß Sie sich alle 
gleichförmigen langweiligen Vorgänge, die Sie oft wiederholen müßten, durch Makros abnehmen 
lassen können. 

3.10.1 Makros aufzeichnen & abspielen 

Wenn Sie ein Makro aulzeichnen wollen, so wählen Sie den Menüpunkt „Aufnehmen“ aus dem 
„Macro“-Menü. Darauthin werden alle folgenden Aktionen, die Sie vornehmen, aufgezeichnet. Mit 
,Anhalten“ aus dem „Macrü''-Menü beenden Sie eine Aufzeichnung. ,„Abspielen“ spielt das Makro 
dann für Sie ab. 

• Laden Sie einen größeren Text ein. 

.Angenommen Sie wollten nun zu Beginn jeder Zeile tlie Zeichenfolge „Start>“ und am Ende jeder 
Zeile die Zeichenfolge „<End“ einfiigen. Normalerweise müßten Sie jedesmal an den Anfang einer 
Zeile gehen, „Start>“ eintippen, dann ans Ende einer Zeile springen, „<End“ eingeben und in die 
nächste Zeile gehen. Wenn Sie tlie Möglichkeiten der Makros ausnutzen, wird das Ganze für Sie sehr 
viel einfacher. 



MaxonPASCAL 


64 


• Fahren Sie mit dem Cursor in die erste Zeile Ilires Textes. 

• Wiihleti Sie nun den Menüpunkt .^ufeeichnen“ aus dem „Macro"-Menü. 

Alle Ibigcntlen Aktionen werden nun aufgezeichnet. 

• Drücken Sie <SHIFT> + <Cursorl.efi>. Damit springen Sie an den Anfang einer Zeile. 

• Tippen Sie nun „Start >“ ein. 

• .Anschlies,send bewegen Sie den Cursor mit <SHlFT> + <CursorRight> an das Ende der 
aktuellen Zeile. 

• Geben Sie nun „< End“ ein. 

• Fahren Sie mit dem Cursor eine Zeile tiefer. 

• 'X'ählen Sie „Anhalten“ aus dem ,,Macro''-Menü. Damit haben Sie die Aufzeichnung beendet. 
Alle Aktionen zw'ischen ,a4ufhehmen“ und ,a\nhalten“ wurden aufgezeichnet und stehen nun 
zu Ihrer Verfügung. 

Sic können nun iederzeit das gerade aufgezeichnete Makro abspielen. 

• Wahlen Sie , „Abspielen“ aus dem „Macro“-Meiiü. Sie sehen, wie die folgende Zeile in 
Sekundenbruchteilen ebenfalls mit „Start >“ tmd „< End“ eingerahmt ward. Sie können die¬ 
sen Vorgang nun beliebig oft wietlerholen und sich damit viel Tipparbeit ersparen. 

Statt obigem zugegebenermaßen etwas sinnlosem Beispiel werden Ihnen in der Pnixis sicherlich 

sehr viel nützlichere Einsatzmöglichkeiten ftir die Makrofunktionen einfallcn. 


3.10.2 Makros speichern & abspielen 

Die mit „Aufnehmen“ aufgezeichneten Makros stehen hier nur kurze Zeit zur Verfügung. W'enn Sic 
ein neues Makro aufzeichnen otler Edward verlassen, so ist Ihr zuletzt aiifgezeichnetes Makro für 
immer verloren. Damit Sie ein besonders [taktisches Makro nicht immer wieder neu aufzeichnen 
müssen, bietet Ihnen Edward die Möglichkeit ein Makro abzuspeichern unti abgespeicherte Makros 
enieut abzuspielen. 

• Falls Sie das Beispiel aus Alischnitt I) noch nicht durchgespielt haben, so sollten Sie es jetzt tun. 
Wir benötigen für die folgenden Schritte nämlich ein frisch aufgezeichnetes Makro. 

• W'ählen Sie nun den Menüpunkt „Speichern als ...“ aus dem „Makro“-Menü. Es erscheint der 
Dateiauswahlfenster. Speichern Sie das Makro nun unter irgendeinem Namen ab. 

• Zeichnen Sie ein anderes Makro auf oder verlassen Sie Edwaril und starten ihn danach erneut. 
Dies dient dazu das aktuelle Makro zu „verge.ssen“. .Mn einfachsten ist dies für Sie, w'enn Sic 
irgendwelche neuen Aktionen wie in Alischnitt T) beschrieben aufnehmen. 

• Waihlen Sie nun „Öffnen und abspielcn“ aus dem „.Makro.s"-Mcnü. Mit dem Dateiaus- 
wahlfetister geben Sie nun das im vorletzten Schritt abges[)eicherte Makro an. 



Sie werden sehen, wie Edward automatiseh die aktuelle Zeile mit „Start >“ und „< End“ 
umrahmt. 

Somit können Sie aucli ein gespeichertes Makro beliebig oft wiederaufrufen. 

Ein mit „Öffnen und abspielen“ abgespieltes Makrti lälJt sich jederzeit mit „Abspielen“ aus 
dem „Makro“-Menü aufrufen. ohne ernetit gektden werden zu müssen. Ein altes von Ihnen auf¬ 
gezeichnetes Makro wird durch „Öffnen und abspielen“ überspielt. 

cs- Im Zusammenhang mit ../Miexx" ergeben sich einige weitere Möglichkeiten. Lesen Sie dazu bitte 
das Kapitel 3.17 „Etlward - Kommtinikation mit ARexx'k 

3.11 Fenster 

Sie wissen jetzt schon, wie man verschiedene Texte bearbeitet. Vielleicht haben Sie sich auch schon 
gefragt, wie man verschiedene Texte oder mehrere Ausschnitte eines bestimmten Textes gleichzei¬ 
tig anzeigen kann. 

Edward ermöglich dies durch die sogenannten Fenster. Was ein Fenster auf der Workbench oder im 
CLl bedeutet ist klar. Bei Edwartl ist ein Fenster ein normales Amiga-Fenster verbunden mit den 
Informationen, die Edward benötigt, um darin einen bestimmten Text oder Textatis,schnitt anzuzei¬ 
gen. Wie das genau funktioniert, erkläre ich Ihnen in den folgenden Abschnitten. 


3.11.1 Erzeugen von Fenstern 

Nach dem Start öffnet Edward sofort ein Fenster, in welchem Sie einen Text bearbeiten können. 

• Geben Sie irgendeinen 'Fext ein. 

• Wählen Sie aus dem ..Fensteri'-Menii den Eintrag „Neu“. Sie sehen kurz, wie sich ein Fenster 
ülTnet. Dieses Fenster liegt gentni über dem ersten Fenster von Edward und hat auch denselben 
Inhalt. Wenn Sie nur flüchtig zugeschtiut haben, werden Sie keinen Unterschied in der Anzeige 
bemerkt htiben. 

• ln der rechten unteren Ecke befindet sich ein Swihol mit welchem Sie die Größe des Fenster 
verändern können. Halbieren Sie das Fenster in der Höhe und der Breite. Sie sehen nun, daß 
darunter Ihr altes Fenster liegt. 

• Verschieben Sie das Fenster in die rechte, untere Ecke. 

• Wählen Sie den Eintrag „Neu“ aus dem „Text“-Menü. 

• Laden Sie einen Text mit „Projekt/Öffnen“, oder geben Sie einen weiteren Text ein. 

Für den weiteren Verlauf unserer ilbung sollten Sie jetzt noch ein Fenster öffnen, es verkleinern 

und in die linken unteren Ecke verschieben. Danach laden Sie einen weiteren Text oder Sie geben 

einfach ein paar Zeilen ein. 



MaxonPASCAI. 


66 


3 . 11.2 Wahl eines bestimmten Fensters 

Es gibt verschialcne Möglichkeiten, ein bestimmtes Fenster zu aktivieren. 

• Am einfachsten fahren Sie mit dem Mauspfeil im entsprechenden Fenster an die Position im 
Text, die Sie bearbeiten wollen und drücken die linke Mausta.ste. Das Fenster wird daraufliin 
aktiviert und der Cursor erscheint unter dem Mauspfeil. Über das Tiefen-Gadget (bzw. bei 
Kickstart 1..3 die beiden Tiefengadgets) können Sie an jedes Fenster herankommen und es tiann 
wie oben beschrieben mit dem Mauspfeil aktivieren. 

• Wählen Sie auf diese Weise das Fenster in tier rechten unteren Fxke an. 

Ebenso wie die Texte werden auch die Fenster in einer Liste verwaltet. Auf einfache Weise können 

Sie das Fenster ati der Listenposition vor oder auch nach dem momentan aktuellen wählen. Hierbei 

gilt ebenfalls alles zu den Texten gesagte. Das momentan aktuelle Fenster sollte das von Ihnen 

erzeugte in der linken unteren Ecke sein. 

• Wählen Sie aus dem „Fenster"-Menü den Eintrag „Vorheriges“. Damit haben Sie wieder das 
Fenster in der rechten, unteren Ecke aktiviert. 

• Wählen Sie erneut „Vorheriges“. Die beiden kleinen Fenster sind nun plötzlich verschwunden. 
Einzig das grosse Fenster, das beim Start von Edward automatisch geöffnet wurde, ist nun sicht¬ 
bar. Das liegt daran, daK bei einer .Aktivierung eines Fensters durch „Vorheriges“ oder 
„Nächstes“ dieses immer automatisch in der Vordergrund geholt wird. 


3.11.3 Schließen von Fenstern 

Sie können ein Fenster auf zw'ei,Arten schließen. Entweder Sie bewegen dem Mauspfeil auf das 
Schliefien-Symbol in der linken, oberen Ecke des Fensters und drücken die linke Maustaste, oder 
Sie wählen den Eintrag „Schließen“ aus dem „Fenster"-.Menü, der das momentan aktive Fenster 
schließt. 

• .Aktivieren Sie, wie im vorigen Abschnitt beschrieben, das große Fenster. 

• Schließen Sie es nun durch den „Schließen“-Menüeintrag. Nun sind nur noch die beiden klei¬ 
nen Fenster vorhanden. 

• Schließen Sie nun das Fenster in der rechten, unteren Ecke mit dem Mauspfeil. 

Vi’enn Sie nun mehrfach „Nächster“ txler „Vorheriger“ aus dem „Text“-Menü (nicht dem 
„Fenster“-Menli!) wählen, dann stellen Sie fest, daß die drei verschiedenen Texte alle noch da sind, 
obwohl Sie zwei Fenster geschlossen haben. Das liegt daran, daß Ix'im Schließen eines Fensters nur 
die Anzeige eines Textes beendet wird. Der Text wird dadurch aber nicht freigegeben. 


3. EDWARD 


67 


Wichtig 


Wenn Sie versuchen, das letzte Fenster von Edward zu schließen, geht Edward 
davon aus, daß Sie die Arbeit beenden wollen. Sollten Sie noch Texte haben, deren 
Änderungen nicht abgespeichert wurden, so werden Sie durch ein Dialog-Fenster 
darauf aufmerksam gemacht. Gegebenenfalls können Sie die Operation mit „Nein" 
abbrechen. Wählen Sie „Ja", dann gehen alle vorher gemachten Änderungen verlo¬ 
ren. 


Lesen Sie hierzu auch Kapitel 3-3.3 ..Freigelxai eine.s Textes“. 


3 . 11.4 Arbeiten mit mehreren Ansichten eines Textes 

Mit Edward können Sie sich mehrere Ansichten desselhen Textes anzeigen lassen und damit arbei¬ 
ten. 

• Sie sollten nun nur noch ein Fenster von F.dward geölTnet haben. Sollte dies nicht der Fall sein, 
so sorgen Sie bitte mit den oben beschriebenen Schritten dafür. 

• Bew'egen Sie nun das Fenster in die linke, obere Ecke des Bildschirms und verändern Sie seine 
Größe so. daß es die gesamte Breite und etwa ein Drittel der Höhe des Bildschirms ausfüllt. 

Damit Sie die in diesem Alischnitt beschriebenen .Möglichkeiten richtig kennenlernen können, soll¬ 
ten Sie nun einen Text einladen oder eingeben, der etwa 100 Zeilen oder mehr umfasst. 

• F.meugen Sie zwei weitere Fenster mit denselben oben beschriebenen Ausmassen und ordnen 
Sie diese untereinander so an, daß es keine Überlappungen zwischen ihnen gibt. 

• /'iktivieren Sie nun das mittlere Fenster und fahren Sie mit dem Cursor nach unten in die 40zig- 
ste Zeile. 

• Aktivieren Sie das unterste Fenster und fahren Sie mit dem Cursor in die letzte Zeile des Textes. 

Sie können nun in jeder der tlrei Atisichten des Textes an t'erschiedenen Positionen Weiterarbeiten. 
Der Vorteil ist, daß Sie in den beiden anderen Fenstern eine Übersicht über ganz andere Textstellen 
halxm, als jene, die Sie gerade bearlieiten. Das kann Iresonders beim Erstellen von Quellcode für 
eine bestimmte Programmiersprache von Vorteil sein. 


Hinweis 


















Alle Änderungen, die Sie an einem Text vornehmen, inklusive der Löschung dessel¬ 
ben, werden nur in dem aktuellen Fenster auch angezeigt. Erst wenn Sie eine andere 
Ansicht des Textes in einem anderen Fenster anwählen, wird auch dort die Anzeige 
aktualisiert. Lassen Sie sich davon nicht verwirren. 




MaxonPASCAL 


68 


Um Ihnen das Arbeiten mit versdiiedenen Ansiclilen eines Textes zu erleichtern, bietet Edward 
zusätzliche Funktionen an. 

• Schließen Sie alle Fenster bis auFeines. 

• Wählen Sie nun „volle Größe“ aus dem „Fenstei-’-Mcnii. 

Sie sehen, daß das letzte Fenster sich wieder auf die mttximale Größe ausdehnt. So erhalten Sie 
schnell wieder den Überblick, falls ein Fenster zu klein war (xler Sie durch Schlief‘!en anderer 
Fenster mehr Platz gew'onnen halx;n. 

• Wählen Sie nun „horizontal teilen“ aus dem „Fenster“-Menü. Daraufliin teilt sich das aktuelle 
Fenster horizontal in zwei gleichgroße Fenster auf. So erhalten Sie schnell die nötigen Fenster 
für verschiedene Ansichten desselben Textes. Mit „vertikal teilen“ unterteilen Sie genauso ein 
Fenster vertikal in zwei gleichgroße Fenster. 

3.12 Verlassen des Editors 
3.12.1. Unterbrechen der Arbeit 

Edward bietet Ihnen besonderen Komfon, falls Sie tlie aktuelle Aitieil an einem oder mehreren 
Texten unterbrechen und den Editor verlassen wollen. Wenn Sie im „Projekt“-Menü den Eintrag 
„Projekt & Ende“ wählen, so speichen Edward zu.sätzliche Informationen über alle momentan ver- 
w'encieten Fenster und Texte ab. Wenn Sie Edward erneut starten, dann öffnet er automatisch 
Fenster untl lädt Texte ein, so daß Sie tlie Arbeit in derselben Umgehung fortsetzen können, in der 
Sie sie unterbrochen haben. 


Wichtig 


Falls Sie Änderungen an Texten Vornahmen, ohne diese zu speichern und daraufhin 
„Projekt & Ende“ gewählt haben, so werden Sie über ein Dialog-Fenster gefragt, ob 
sie diese Texte „vergessen" wollen. Antworten Sie hier mit „Nein“, dann wird die 
Operation abgebrochen. Wählen Sie „Ja", dann gehen die letzten Änderungen verlo¬ 
ren! 

• Damit Sie einen kleinen Eindruck über die .Möglichkeiten der .Arbeitsunterbrechung erhalten, 
sollten Sie nun Fenster mit verschiedenen Texten erzeugen. 

• Wählen Sie nun den Menüpunkt „Projekt & Ende“ aus dem „Projekt"-Menü. Sie helinden sich 
nun wieder auf der Workbench oder im CU, je nachdem, wie Sie Edward gestartet haben. 

• Starten Sie Edward erneut. Automatisch öffnen sich die Fenster wieder so, wie Sie vor dem 
Verlassen angeordnet waren untl zeigen die zuletzt bearbeiteten Texte an. Sie können nun ein¬ 
fach mit der .Arbeit fortfahren. 






3. EDWARD 


69 


3.12.2 Verlassen des Editors 

Im Gegensatz zu „Projekt & Ende“ verlassen Sie mit „Ende“ aus dem „Projekt“-Menü den Editor, 
ohne dal.< Informationen zur momentanen Arbeitsumgebung gespeichert werden. 


Wichtig 




_i 


Falls Sie Änderungen an Texten Vornahmen, ohne diese zu speichern und daraufhin 
„Ende“ gewählt haben, so werden Sie über ein Dialog-Fenster gefragt, ob sie diese 
Texte „vergessen“ wollen. Antworten Sie hier mit „Nein“, dann wird die Operation 
abgebrochen. Wählen Sie „Ja“, gehen die letzten Änderungen verloren! 


3.13 Iconify & HotKey 


3.13.11conify 

Bemitzeu Sie Etlward auf dem Workbench-Screen, so wiixl es manchmal sehr lästig sein, wenn 
Etiward mit seinen Fenstern etwas im Hintergrund verdeckt. Vielleicht wollen Sie einfach ein 
Pnrgramm von der Workbench aus starten oder in der Shell den Compiler anwerfen. Damit Sie sich 
nicht durch alle Fenster Edwards tlurchklicken müssen, gibt es die Funktion Ikonifizieren 

Wählen Sie einfach aus dem „Fenster“-Menü tlen Eintrag „Ikonifizieren“. Schon verschwanden alle 
Fenster, und es erscheint links oben auf dem Bildschirm ein Fenster, das nur aus einer Titelzeile 
besteht. In dieser steht „Iconified Edward“. Edw'ard ist nun nicht mehr aktiv. Das kleine Fenster 
künnnen Sie irgendwohin schieben, wo es Sie nidit stören kann. 

Wollen Sie Edward waeder aktivieren, so haben Sie zwei Möglichkeiten. Die zw'eite wird im .Alischnitt 
HotKey beschrielx.'n. 

Die erste Möglichkeit besteht darin, das Fenster mit dem Titel „Iconified Edward“ zu aktivieren 
und dann die rechte Maustaste zu drücken. Daraufhin baut Edwaird wieder alle seine Fenster auf 
und Sie können Weiterarbeiten. 


3.13.2 HotKey 

Um Etlward nach einem Iconify wieder aktivieren zu können, oder um einfach das Fenster mit dem 
zuletzt bearbeiteten Text in den Vordergamd zu bekommen, gibt es den HotKey. 

Der HtttKey ist eine Taste in Veitindung mit bestimmten Qualifiern ( SlllFT, ALT, CTRL, LEFT_AM1- 
GA ). Wird diese Taste gedrückt, so wird das Fenster mit dem zuletzt bearbeiteten Text und der 
Bildschirm auf dem sich dieses Fenster befindet in den Vordergrund gebracht. War Edw'ard im 
Iconify-Zustand, so wird dieser aufgehoben, und alle Fenster w'erden wieder geöffnet. 

^ Näheres zur Dennition des HotKeys erfahren Sie im Kapitel .3.16 „Benutzerdefinierte Menüs, 
Tastatuitelegung untl HotKey“. 




MaxonPASCAL 


70 


4.14 Der Kommandozeilen-Interpreter 

Die Bedienung Edwards über Menüs und Formulare slellt für den Anfänger sicherlich eine große 
Erleichteiung dar, der Profi ist in vielen Fällen jedoch bereit auf diesen Komfort zu verzichten, w'enn 
er nur besonders schnell die wichtigsten Funktionen benutzen kann. 

Dies kann zum einen durch Definition von „Short-Cuts" wichtiger Menüpunkte und durch Belegung 
von Funkeionstasten etc. geschehen. Eine weitere mächtige .Möglichkeit ist der Kommandozeilen- 
Interpreter Edwards. Hier können viele Befehle und Befehlskombinationen Edwards direkt eingege¬ 
ben und ausgeführt werden. 

Die Eingabe einer Kommandozeile leiten Sie durch die <ESC>-Ta.ste ein. Daraufhin erscheint der 
Cursor in der untersten Zeile des aktiven Textfensters. Die dort angezeigte Textzeile wird durch 
eine Leerzcile ersetzt, in der Sie nun Ihre Eingaben machen können. Ein erneutes <ESC> bricht 
die Eingabe ab. Drücken Sie stattdessen < RETURN > oder < ENTER > w'erden die von ihnen ein- 
gebenen Kommandos ausgewertet. 

Mit <CTRL>-F<0> gelangen Sie ebenfalls in den Eingabemodus des Kommando-Interpreters 
mit der Be,Sonderheit, daß Ihre letzte Eingabe wieder zur Verfügung steht und geändert wenJen 
kann. 

<CTRL> -1- <G> bewirkt eine erneute Ausführung der zuletzt eingebenen Kommandos. 

t*' Weitere Informationen über den syntaktisch koirekten Aufbau einer Kommandofolge erhalten 
Sie in Kapitel 3.16 „Benutzerdefinierte Menüs, Tastaturbelegung und HotKey“. 

•sc Alle verfügbaren Kommandos Etlwards mit Kurzerläuterungen und Parameterbeschreibung sind 
im Anhang enthalten, 

3.15 Globale Einstellungen 

3.15.1 Das „Globale Einstellungen"-Formular 

Mit dem „Globale Einstellungen"-Formular, das sich öffnet, wenn Sie „Einstellungen...“ aus dem 
„Projekf'-Menü wältlen, können Sie verschiedene Einstellungen verändern, die den gesamten Editor 
betreffen. 


3. EDWARD 


71 


0.1 ^Gtobat^ ■ ■ . . . : ■ . 


Display -—— 

Datei --- 

Ruflösuing | 

Gl Confiauration Icon | 

iiiii .1 ilii 

Icon Jlool ICdwardiEd j 

Red 10 iiliiiti ><,, < "i ’Äisiiiiäiitiiii 

Green 10ijiiF’f‘‘f ■ .i.i ■liiiiliüiitisli 

CjI ftuto-^Save OFF | 

■*• 300 1 Ze it 

_j Erste Ile Etackup 

Blue 10 Slii;iS;.!....c....:..;...:!.«iit!iiliiil|iiii 

Fontnane |Courier.fon| 

Pf ad |t :M.bak | 

[ ^ ■ - \ 

Font^röpe |13 | 


Text 

Neuer flont | 

-•112 {»Sero l Ibere ich 


Gl Fast Textdraw | 

- Undo—Konftauration 
-• 256 ► i Tiefe 

f JDisplav Beep 

■*•32 ►! Speicher <kB> 

0.K 1 fibbruch | 


Auflösung wählen 

Ik'i Klick auf dieses Symbol erscheint ein Dialog-Fenster aus dem Sie die gewünschte Auflösung 
auswahlen können. 


Farben 

Mit den folgenden Symbolen können Sie die vier Farben einstcllen, in denen die Fenster und 
'l'c.xte lidwards auf einem eigenen Bildschirm dargestellt werden sollen. Diese Felder sind nur 
anwählbar, wenn Sie Edward aut einem eigenen Screen betreiben! Aul tler ^X'orkbench steht 
Ihnen zur Veränderung der Farlren der Frefs-Einstcller zur Verfügung. 

Fontoame 

ln dieses 'Fexteingabefeld können Sie den Namen des Zeichensatzes angeben, in welchem die 
Texte Edwards dargestellt werden sollen. 

Fontgröße 

Dieses Texteingabefeld erfaßt die Fontgrölse. 


Wichtig 













Für den beschleunigten Bildaufbau bei der Textdarstellung mußten bei der 
Entwicklung Edwards gewisse Kompromisse eingegangen werden. Daher ist es lei¬ 
der nicht möglich Proportional-Zeichensätze zu wählen. Sollten Sie einen falschen 
Zeichensatz gewählt haben, so erfolgt keine Änderung der Textdarstellung. 

Neuer Font 

Durch An klicken dieses Symbols öffnet sich ein Dialog-Fenster, mit dem Sie auf komfortable 
Weise den gewiin,schten Zeichensatz wählen können. 




















M;ixonPASCAL 


72 


Undo Konfiguration 

Mit diesen beiden Zahlenfeldern kontrollieren Sie das Verhallen von lidward im Zusammenhang 
mit der Lndo-Funktion, Mit Undo-Depth geben Sie an. wie viele Operationen, die einen Text 
verändern, gemerkt werden sollen. Sollte Sie an einem Text eine .Vnzalii von Ändcrungeji vor¬ 
nehmen, die die.sen Wert überschreitet, so werden alte Änderungen „vergessen“. Einfache 
Operationen, wie „Zeichen löschen“ oder „Neues Zeichen einfugen“ benötigen keinen 
Zusatzspeicher zum Merken. Das Ausschneiden eines Blockes dagegen kann nur gemerkt wer¬ 
den, wenn genügend Speicherplatz bereitgestellt wurde, um den ausge.schnittenenen Block 
zusätzlich speichern zu können. Würden Sie nun sehr oft Blöcke ausschneiden und kopieren, 
so würde sehr viel Speicher in Anspruch genommen. Mit „UndoMem“ begrenzen Sie den 
Speicherplatz, den die Undo-Funktion in .Anspruch nimmt, auf einen Maximal-Wert. Wird dieser 
überschritten, st) werden alle Operationen „vergessen“, um genügend Speicher wieder freizuge¬ 
ben. 


Wichtig 










Da die Undo-Funktion für jeden Text die notwendigen Informationen zum 
Rücknehmen einer Veränderung merken muß, gilt Undo-Mem auch als Wert für 
jeden Text. Das bedeutet, daß Sie für jeden Text, den Sie bearbeiten, im ungünstig¬ 
sten Fall die Menge von „UndoMem“ zusätzlich an Speicher beanspruchen. 

Mit den anschließend beschriebenen Symlx)lcn können Sie das Verhalten Edwards beim Speichern 
von Dateien angeben. 

Datei 

Mil tliesem Blätter-Symbol geben Sie an, ob Edward beim Speichern einer Datei ein Pictogramni 
anlegen („Configuration Icon“) oder darauf verzichten soll („No Icon“). 


Wichtig 





Nur wenn Sie die Option „Configuration Icon“ gewählt haben, werden beim Sichern 
einer Datei wichtige Zusatzinformationen ebenfalls mitabgespeichert. Dazu gehören 
unter anderem die aktuelle Position in Ihrem Text, der „Word-Wrap“-Modus und - 
sehr wichtig - die Strukturierung des Textes durch ausgezeichnete Zeilen. 

Configuration Icon 

Wenn Sie ein Pictogramm zu jedem Text abspeichern las.sen, .so können Sie mit diesem 
Eingabefeld bestimmen, w'elches Programm beim Doppelklick auf das Pictogramm des gespei¬ 
cherten Textes geladen werden soll. Im Normalfall sollte dies „Edward:Edwarri“ sein. 

Auto-Save 

Edward kann die von Ihnen bearbeiteten Texte nach einer bestimmten Zeitspanne abspeichem. 
Mit dem Blätter-Symbol haben Sic die Wahlmöglichkeit zwischen : 




3. EDWARD 


73 


• ,Auto-Save OFF“, das bcdeutci das automatische Abspeichern von Texten ist abgeschaltet. 

• „Auto-Save“, dann speichert Edward nach der im Zeit-Feld angebenen Zeitspanne alle verän- 
denen Texte automatisch ab. 

• „Confirm Auto-Save“, dann fragt F.tlward vor dem automatischen Speichern von Texten um 
Erlaubnis. 

Zeit 

Mit diesem Einsteller können Sie die Zeit in Sekunden angelaen, die verstreichen darf, bis 
Edward automatisch die geänderten Texte abspeichert. 

Erstelle Backup 

Hiermit bestimmen Sie, ob beim Speichern einer Datei eine möglicherweLse schon voihandelte 
Datei gleichen Namens in ein anderes Verzeichnis umkopiert tmd umbenaniit werden soll. 

Pfad 

ln diesem Eingabefeld geben Sie ein spezielles Muster tut. Dieses besteht aus dem Pfadnamen 
gefolgt von einer Zeichenkette, die ein enthalten sein kann. Beim Anlegen eines Backups 
einer Datei wird diese in den angebenen Pfad umkopiert. Daraufltin wird sie nach der oben 
eiwähmen Zeichenkette umltenannt wobei der durch den alten Namen der Datei ersetzt 
wird. 

ScroUbereich 

Mit ScroUbereich ist der Bereich innerhalb eines Textfensters gemeint, in dem der Cursor das 
Scrollen des Textes bewirkt. Sie können den Altstand des Cursors zu den Fenster- 
Randkomponenten in Prozent angeben. 

Textdraw 

Durch das Blatter-Symbol können Sie einsiellen, ob die Textau.sgabe mit Betriebssystem- 
Funktionen oder direkt gemacht werden soll. Diese Einstellmöglichkeit erhöht die 
Kompatibilität Edwards zu späteren Betriebssystem-Versionen und zu neuen Grafikkarten mit 
besonderen Fähigkeiten. 

Display Beep 

Mit diesem Symbol lälsl sich der Display-Beep, der durch jeden Fehler erzeugt wird, abschalten. 

OK 

Abbruch 

Mit diesen beiden Symbolen übernehmen Sie die Einstellungen des Fonnulars oder Sie brechen 
den Vorgang ab. 



MaxonPASCAI, 


21 

3,15.2 Das „Seiten format"-Formular 

Mit dem „Seitenforniaf'-Menü können Sie bestimmen, wie ein Text auf dem Drucker ausgeeeben 
werden soll. 




fej 


Kopf 

—J |!i]iW»P7iITOSF^ 


ÜHiliiiiiiiSiitliÜjäiöliliiüliiiiiiii 1 

£u0 

Z 0 il 0 n bis xun Tent 

□•1 Center* | 





iiüliiiiSiliiiliIjiWtll Zeiten nach den Text 

Gl Center ( 


feft P- 1 Zelten/Selte 

1 _1 Fprn Feed I 


J auM Rnfang 


_aJL_JtJ 3c«n Ende 


r!« 5 >■ i L Inker Rand 


•** 8» t Rechter Rand 
I TS Zeiten/Tent 


__—I Fetten Überspringen 
drucke £ei lennunnern 

ji l 'SitiiiijiMlI i l lililii Nuwwernbere Ich 
*”JLaden , . . | j.peichern. 


J!L 


Bbbrtich f 


Kopf 

Fuß 


Mit diesen Gadgets geben Sie an ob eine Kopf- bzw. eine Fußzeile ausgedruckt werden soll. 

Hier wird der lext für die Kopf- bzw. Fußzeile angegeben. S|x-zielle Kürzel in diesem Text wer¬ 
den beim Druck interpretiert. Möglich sind hier: 

,,%D'' = Tag, „%M'‘ = Monat, = Jahr, „%h" = Stunde, „%m“ = Minuten und „%s“ = 
Sekunden. Durch diese Kürzel kann die aktuelle Zeit Ixum Ausdruck einer Seite in der Kopf- 
bzw. Fußzeile eingefügt w'erden. 

Weiterhin kann durch „%p“ die Seitennummer eingefügt werden. 

Zeilen bis zum Text 

Gibt die Anzahl Zeilen zwischen der Kopfzeile und dem Text an. 

Zeilen nach dem Text 

Analog dtizu gibt dieser Einsteller die Anzahl Zeilen zwischen Text und Fußzeile an. 

.Mit den Felder lechts daneben läßt sich die Kopf- bzw. Fußzeile zentriert, links- oder rechtsbün¬ 
dig dntcken. 


Zeilen/Seite 

Fhermit geben Sie an, wieviele Zeilen inklusive Kopf- und Fußzeile, sowie aller Abstände auf ein 
Blatt passen. 

zum Anfang 

Hiermit defininieren Sie den Abstand in Zeilen vom Blattlxtginn zur ersten Zeile, die gedruckt 
werden soll (Dies kann die Kopfeeile oder die erste Textzeile sein). 






3. HD\>;^RD 


73 


zum Ende 

Gibt an;ilc)g zu „zum Anfang“ den Abstand in Zeilen zum Ende des Blattes an. 

Linker Rand 

Der Abstand des linken Randes in Zeichen. 

Rechter Rand 

Die Breite einer Zeile in Zeichen. 

Zeilen/Text 

Dient zur reinen Information. Sie sehen, wieviele Zeilen Rir die Ausgabe des lextes übrigblei¬ 
ben. 

Form Feed 

Nach tiem Drucken aller Seiten wird ein zusätzlicher FormFeed gesendet, wenn Sie diese 
Ojition aktivieren. 

Falten überspringen 

Hiermit geben Sie an, ob beim Druck eingelältete Zeichen übersprungen werden sollen. 

drucke Zeilennummern 

VX'ählen Sie diese Option an, so wird jede gedruckte Zeile durchnumeriert. 

Nummernbereich 

Die Stellenanzahl einer Zeilennunimer kann hier angegeben werden. 

laden 

Laden eines bestimmten Druckformates. 

Speichern 

Speichern der Einstellungen. 

OK 

Die Einstellungen werden übernommen. 

Abbruch 

Die Einstellungen werden verworfen. 


3.16 Benutzerdefinierte Menüs, Tastenbelegung, HotKey 

In den im Verzeichnis EDWARD: abgelegten Dateien mit der Endung „.DEF‘ befinden sich die 
Definitionen für die Menüs sowie die Tastaturbelegung Edwards. Diese sind in w'eiten Grenzen ver- 
äntlerbar. Der Aufbau der Definitionsdatei lehnt sich dabei an eine sehr primitive 
Programmiersprache an, besitzt also eine ganz einfache Syntax. Die folgenden Abschnitte werden 
Ihnen das näher erläutern. 



M;ixonPASCAL 


76 


3.16.1 Kurze Einführung in die EBNF-Darstellung 

Tja, um Ihnen tlie Syntiix der Definitionen ein biiilchen näherzubringen muß ich jetzt leider etwas 
weiter ausholen und die Erweiterte-Batkus-Naur-Dai-stellung einftihren. Hinter diesem ominösen 
Namen, der jedem Informatik-Studenten mehr oder weniger bekannt ist, verbirgt sieb eine 
Darstellungsfomi für die Syntax von Programmiersprachen. Mächtig kompliziert ist sie deswegen 
aber nicbt. 

Fdne Definition beginnt immer mit dem Namen des zu Definierenden, daraulfiin folgt ein 
Zeichen. An dieses schließt sich die eigentliche Definition an. Sie gibt im wesentlichen an, welche 
Zeichenfolgen syntaktisch korrekt sind. Dies geschieht durch direkte Angabe von Zeichenfolgen 
oder der Angabe einer anderen Definition, in der dann nacbge.schaut werden muß. Zeichenfolgen W 
werden immer in Anfühnangsstrichen wiedergegeben. Jede Definition wird mit einem abge¬ 
schlossen. 


Wort = "Mahlzeit" . 

Würde die Svmtitx unser Sprache nur aus obiger Definition bestehen, so wäre die einzige syntaktisch 
korrekte Zeichenfolge „Mahlzeit“. Zugegebenermaßen etwas dürftig. Mir sind allerdings 
Zeitgenossen bekannt, deren Sprachschatz nicht signifikant umfangreicher ist. 


KlairanerAusdruck = '• ( " Ausdruck . 
Ausdruck = "Mahlzeit" . 


ln diesem Beispiel nimmt die Definition von Klammerausdruck bezug auf die Definition von 
Ausdruck. Der einzige korrekte Klammerausdaick ist „(Mithlzeit)“. 


Um anzuzeigen, daß mehrere Zeichenfolgen einer Definition genügen, dient folgende Notation : 
Name = (... | ...J. wobei.“ für eine Zeichenfolge oder eine andere Definition steht. 


Beispiel 3: 


Wunsch = ( "Guten Appetit" | KlaanmerAuedruck ) . 
KlammerAuadruck = "(" Ausdruck ")" . 

Ausdruck = "Mahlzeit" . 


Ein Wunsch kann laut dieser Definition entweder aus der Zeichenfolge „Guten Appetit" oder der 
Zeichenfolge „(Mahlzeit)“ bestehen. 

Die bisher erwähnten Beschreibungsmöglichkeiten Rir die Syntax einer Sprache würden schon aus¬ 
reichen, aber um Schreibarbeit zu ersparen, worden noch einige Abkürzungsmöglichkeiten geschaf¬ 
fen. 

Steht auf der rechten Seite einer Definition ein Ausdaick in eckigen Klammem, so bedeutet dies, 
daß der Inhalt der Klammern stehen kann oder auch nicht. 



3. EDWARD 


77 


Beispiel 4: 

Satz : "Jetzt geht es " ["endlich "] "zur Sache." 

Die beitlen korrekten Zeichenfolgen wären : Jetzt geht es zur Sache," und Jetzt geht es endlich zur 
Sache." 

Eine letzte Schreihweise hedient sich der geschweiften Klammern. Ein Ausdruck in geschweiften 
Klammem kann beliehigoft oder auch gar nicht stehen, 

Beispiel 3: 

Satz : "Hallo " {"Echo "} "." 

Korrekte Zeichenfolgen wären : „flallo Jlallo Echo„Hallo Echo Echo." usw.. 

Mit den obigen Erläuterungen sollten Sie nun den Auftiau der Definitionsdatei verstehen können. 
Falls Ihnen bisher alles zu theoretisch trocken vorkam, dann sollten Sie sich einfach mal die 
Definitionsdatei „Edward.DEF“ anschauen. Die Stiiiktur, die die Definitionen haben müssen, sollte 
Ihnen auch tlurch einfaches Anschauen schnell klareerden. 


3.16.2 Definition eigener Menüs 

Die SyntiK der Menü-Definitionen ist wie folgt definiert. 

Menu = "MENU" MenuTitle { MenuGroup } . 

MenuGroup = "TITLE" QuotedString { Menuitem ) . 

Menultem = ("ITEM" QuotedString CommandList [QuotedString] I 

"EMPTY" ) . 

CommandList = ( "(" Command ")" I "(" {CommandList} ")" ) . 

Command = ( EdwardConimand I CommandList ) . 

QuotedString ist eine Zeichenfolge zwischen zwei iloppelten .Mifühmngszeichen (z.B. „Projekt" 
für das Projekt-Menü), 

EdwatdCommand ist ein Kommando des Editors mit Argumenten (falls erforderlich), wie es im 
iknhang „Die Kommandos des Editors" beschrieben wird. 

Zur Bedeutung der einzelnen Definitionen: 

Menu: 

Die Menütlefinitionen in der Datei „Edward.DEF“ müssen mit dem Schlii.sselwon „MENU“ begin¬ 
nen. Daraufhin folgen die Definitionen der Einträge ( MenuGroup ), wobei mindestens ein Eintrag 
definiert werden muE. 

MenuGroup: 

Eine Menü-Gruppe beginnt mit tiem Schlüsselwort „TITLE“, dem sich ein QuotedString anschließt. 
[}ie Zeichenfolge des QuotedString (s.o.) gibt den Titel der Menü-Gruppe an, der erscheint, w'enn 
Sie die rechte Maustaste drücken. 



MaxonPASCAL 


78 


Auf die Angabe des QuotedSting können beliebig viele Einträge folgen. 

Menuitem: 

Ein Eintrag in einer Menü-Gruppe (MenuGroup ) besteht enroeder aus dem Schlüssel-Wort „EMP- 
TY“, dieses dient dazu verschieden Einträge in einer Gnippe voneinander durch einen Balken zu 
trennen, oder dem Schlüsselwort „ITEM“ und einigen weiteren Angaben. „ITEM“ muß in jedem 
Fall ein QuotedString folgen. Dieser gibt den Text des Menü-Eintrags an, der erscheint, wenn Sie mit 
der Maus die entsprechende Menü-Gruppe autklappen lassen. Daran schließt sich eine 
CommandList an. Die CommandList ist eine Folge von Kommandos mit Argumenten, die Edward 
versteht. Diese werden jedesmal ausgeführt, wenn Sie den entsprechenden Eintrag in einer Menü- 
Gruppe mit der Maus angewählt haben. 

Mit einem w'eiteren walilweisen QuotedString können Sie ein Zeichen angeben, welches als Short- 
Cut dienen soll. 


3.16.3 Definition der Tastaturbelegung 

Keys = "KEYS" { ModeList ) 

ModeQualList = "("{ Mode I Qualifler I "") { KeyDef }")" 

Mode = t "MODEl" | "MODE2" | "MODE3" ) 

Qualifier = ( "ALT" | "SHIFT" | "CTRL" | "LEPT_COMMAND" ) 

KeyDef = ( KeyName | QuotedString | "NP" QuotedString ) 

CommandList . 

KeyName = { 

"Fl" I "F2" I "F3" I "F4" | "F5" I "F6" | "F7" | "F8" | "F9" | "FlO" 1 
"ESC" I "BACK" I "DEL" | "HELP" | 

"CRSRÜP" I "CRSRDOVnSf" | "CRSRRIGHT" | "CRSRLEFT" | 

"TAB" I "RETURN" | "SPACE" | "ENTER" | 

"NP_NÜML" I "NP_SCRL" | "NP_PRTSC" | "NP_HOME" | "NP_UP" | "NP_PGUP" | 
"NP_LEFT" I "NP_RIGHT“ | "NP_END" | "NP_DOWN" | "NP_PGDN" | "NP_INS" | 
"NP_DEL" ) 


CommandList = ( "(" Command ")" | "(" {CommandList} ")" ) 

Command = ( EdwardCommand | CommandList ) 

QuotedString ist eine Zeichenfolge zwischen zwei doppelten Anführungszeichen 
(z.B. “Projekt“ für das Projekt-Menü). 

EdwardCommand ist ein Kommando des Editors mit Argumenten (falls erforderlich), wie es im 
.Anhang) „Die Kommandos des Editors“ beschrieben wird. 

Wie ein Tastendruck interpretiert werden soll, hängt von verschiedenen Umständen ab. Wichtig ist 
zunächst einmal, ob die Taste in Kombination mit <ALT>, <CTRL>, <SF11FT> oder 
<LEFT_COMMAND> (der linken <AMIGA>-Taste) betätigt wurde. <ALT>, <CTRL>, 
<SMIFT> und <LEFT_COMMAND> werden auch als Qualifier bezeichnet. Für jede Ireliebige 
Kombination aus diesen Qualifiern wird der Tastendruck gesondert interpretiert. Das bedeutet. 


3. EDWARD 


79 


wenn Sie <A].T> + <F1> drücken, geschieht etwas anderes, als wenn Sie 
<.\LT> + <CTR1> + < Fl > drücken. Drücken Sic eine Taste, ohne gleichzeitig eine oder mehre 
Qualifier-Tasten gedrückt zu haben, so wird aucli das gesondert interpretiert. Darau,s ergeben sich 
sechzehn verschiedene Möglichkeiten eine Txste zu belegen ( 2 ♦ 2 * 2 *2; (mit <ALT> und ohne 
<.M.T>) »(mit <CTR1.> und ohne <CTRI.>) * (mit <SH1FT> und ohne <SHIFT>) * (mit 
<1.FIT_AM1GA> und ohne <LEFT_AMIGA>)). 

Das w'ar schon ganz schön kompliziert, aber es wird noch viel schlimmer. 

Mit den Befehlen „SelModel“, „SetMode-^“ und „SetModej“ können Sie einen speziellen Modus set¬ 
zen. Ist dieser Modus gesetzt, so wird eine daraufliiii gedrückte Taste in Kombination mit allen 
Qualifiem wieder speziell interpretiert. Danach wird der Modus wieder zurückgesetzt. 

Wurde eine Ttiste nicht mit einer CommandList belegt, ,so w'ird beim Druck der Taste das ihr ent¬ 
sprechende .3SC11-Zeichen in den Text eingelügt. Das bedeutet Rir Sie eigentlich nur, daß Sie ein „a“ 
bekommen, wenn Sie die Taste mit dem „a“ drücken. Es sei denn, aus irgendwelchen Gründen hät¬ 
ten Sie diese Taste mit einer Commandl.ist belegt. 

Was das alles zu bedeuten hat, muß Ihnen jetzt noch nicht sonnenklar aufgegangen sein, zumindest 
können Sie jetzt einen Zusammenhang mit der oben angegebenen Syntax erkennen, den ich Ihnen 
aber gerne noch etwas näher erläutere. 


Keys: 

Jede Definition der Tastaturbelegung muß mit dem Schlüsselwort „KEYS“ beginnen. Diesem 
schliefet sich eine beliebige Anzahl von .Modeüsts an. 


ModeQualList: 

Bei diesem Wort sollte es jetzt bei Ihnen klingeln, ln einer ModeQualList geben Sie an, wie eine 
Taste in Verbindung mit den gesetzten Modes und Qualifiem interpretiert werden soll. Nach der öff¬ 
nenden rtjnden Klammer “(" mit der eine ModeQualList beginnt, folgt eine beliebige Kombination 
aus Mode- und Qualifier-Angaben (z.B.: “(MODE2 ALT SHIFT..." oder gar nichts. 

Es schliessen sich die KeyDefs an und zum Schluß kommt die obligatorische schliessende mnde 


Klammer“)“. 


KeyDef: 

Eine KeyDef beginnt mit der Angabe der zu belegenden Taste. Ist dies eine Sondertaste, so geben 
Sie deren speziellen Namen an (alle Namen sind oben aufgeführt worden). Ansonsten müssen Sie in 
einem QuotedString das Zeichen angeben, das erscheint, wenn Sie die Taste ohne irgendeinen 
Qualifier drücken (also ohne <SlllFr>, <ALT>, <CTR1.> ). Befindet sich die Taste auf dem 
numerischen Ziffernblock, so geben Sie vor dem QuotedString das Schlüsselwort NP ( NP für 
NumeriePad = Zahlenblock) an. 

Der Angabe der zu belegenden Taste folgt eine CommandList. Diese gibt die Kommandos an, die 
Edward nach dem Drücken der entsprechenden Taste ausführen soll. 



MaxonPAS(;AI. 


80 


Damit Sic nun nicht glauben, nur Nobelpreisträger köntiten die Tastaiurbelegung Edwards ändern, 
werde ich Ihnen nun am Ende des Abschnittes ein paar Beispiele vorführen. 

Beispiel 1: Zusammenhang zwischen Qualifiern und Taste 

KEYS 

( 

DELETE (delets) 

) 

(ALT CTRL 

DELETE (inaertchara “Auf 'nem PC war das das Ende" ) 

Mit der obigen Definition wird beim Drücken von DELETE ( Taste <DEL> ) in Verbindung mit 
<-AI,T> und <CTRL> der Text ,4uf ‘nem PC war das das Ende“ ab der aktuellen Cursor- 
Position eingefügt. Dieses Beispiel befindet sich schon in der Datei „Edward.DEF". Probieren Sie es 
ruhig mal aus. Drücken Sie dagegen nur <DEI.>, so wird das Zeichen rechts vom Cursor gelöscht. 

Beis|iiel 2 : Zusammenhang zwischen Modi und Taste 

KEYS 

(CTRL 

"X" (SetModel) 

) 

(MODEl CTRL 

"c" (ineertchars "EMACS Quit" ) 

"s" (inaertchars "EMACS Save" ) 

) 

Obige Definition bewirkt folgendes: 

Wenn Sie <CTRL> -fi- <x> drücken wird Modus 1 eingestellt. Die nächste Taste wird also gemäß 
den Angaben für .Modus 1 interpretien. Danach wird automatisch wieder der Normal-Modus einge¬ 
stellt. Wenn Sie al.so <CTRL>-l-<x> und gleich an.schließend <CTRL>-f <C> drücken, so 
wird er I ext „EMACS Quit“ rechts vom Cursor eingefügt. 

Auch dieses Beispiel ist schon in der Datei „Edward.DEF“ enthalten. Sie können es daher gleich aus¬ 
probieren. 

Sollten immer noch nicht alle Klarheiten beseitigt sein, dann laden Sie die Datei „Edward.DEF" ein¬ 
fach ein untl schauen sich die Definitionen an, verändern Sie auch ruhig ' mal etwas, aber vergessen 
Sie nicht, sich eine Sicherheitskopie von „Edward.DEF,, anzulegen. 


3.16.4 Definition des HotKeys 

HotKey = "HOTKEY" Quallfier HotKeyDef 
Qualifier = ( Quallfier | "ALT" | "SHIFT" | "CTRL" | 

"LEFT_COMMAND" | "" ) . 

( KeyName | QuotedString | "NP" QuotedString ) 


HotKeyDef = 



3. EDWARD 


81 


KeyNam = ( 

„Fl.. I ..f2" I "F3" I "Fa" I "FS" I “Fe" I "F7" 1 "F8" I "F9" I "FlO" I 
"ESC" I "BACK" 1 "DEL" I "HELP" I 

"CRSRUP" I "CRSRDOWN" I "CRSRRIGHT" I "CRSRLEFT" I 
"TAB" I "RETURN" 1 "SPACE" 1 "ENTER" I 

"NP_NUML" I "NP_SCRL" I "NP_PRCSC" I "NP_HOME" I "NP_UP" I "NP_PGUP" I 
"NP LEFT" I "NP_RIGHT" I "NP_END" | "NP_DOWN" | "NP_PGDN" I "NP_INS" 
"NP_DEL" ). 

Wie Sie im Kapitel 3.13 „Iconify & HoiKey“ nachlesen konnten, bnn Rdward nach Au.sführen tler 
Iconify-Funktion wieder durch einen I lutKey aktiviert werden. Welche Taste als HotKey dient, wird 
ehenlalls in der Datei „Edward.DEF“ angegeben. Die Syntax hierfür ist sehr einfach. Die Definition 
des HotKeys beginnt mit dem Schlüssclwon „HOTKEY“. Es folgt eine Liste von Qualifiern wie z.B. 
<.\LT> oder <l.EFr_.4MlGA> und schließlich wird die Taste angegeben, tlie hinfort die Rolle des 
HotKeys spielen soll. 


HOTKEY 

CTRL ALT DELETE 

Das Ixtdeutet, wenn Sie Edward in den Iconih'-Zustand geschickt haben, so können Sie Ihn durch 
Drücken von <CTRL>, <.A1,T> und der <DEL>-Taste wieder aktivieren. Auf einem PC würde 
diese Tastenkombination übrigens einen Soft-Reset atisführen. 


3.16.5 Einladen einer neuen Definition 

Normaleivveise lädt Edward die Definition der Menüs, der Tastatur, etc. gleich beim Start aus der 
Datei „Edward.DEF“. Sie können aber auch später die einzelnen Definitionen äntlern, indem Sie 
eine andere Definition.sdatei einladen. Dies ist durch Wahl von „Def-Datei laden“ aus dem 
„Extra.s’‘-Menü mftgUch. Es erscheint dann ein Dateiau.swahlfenster, mit dem Sie eine andere 
Definitionsdatei angelaen können. 

3.17 ARexx - Kommunikation mit Edward 

Diese Kapitel kann leider (für Sie) und zum Glück (für mich, den Autor dieses Handhuches) keine 
Einführung in die Programmiersprache Rexx sein. Dies würtle den Rahmen dieses Handbuches bei 
weitem sprengen. 

Außerdem gibt es inzwischen genügend Sekundärliteratur zu diesem Thema. Was soll dann dieses 
Kapitel, werden Sie sich fragen? 

Ganz einfach: Ihnen die Möglichkeiten im Zusammenspiel zwischen Edward und ,ARe.\x aufeeigen. 

;\Rexx wurde ja gerade tiazu geschaffen, die untei'schiedlich.sten Programme von außen zu steuern 
und in ihren .Mrlauf einzugreifen. 



iMaxonPASCAI. 


82 


Kclward liat auch auf diesem Gebiet eine ganze Menge zu Itieten. Das Meiste verbirgt sich jedoch 
unter der Oberfläche. 

Die einzige Funktion, die Sic direkt über Menüs ansprechen können, ist der .Menüpimki .„ARexx- 
Befehl" aus dem „MaknV'-Menü. Wenti Sie diese Fitnktion wählen, so erscheint ein 
Dateiauswahlfenster, mit welchem Sie ein .ARexx-Programm auswählen können. Dieses wird daraut- 
hin ausgeführt. 

Alles Vl'eitere, was sich aus dem Zusammenspiel zwischen ARexx und Edw'ard ergibt, wird erst über 
die s[)eziellen Kommandos Edwards möglich, mit denen intern alle Funktionen, die Sie z.B. über die 
Menüs aktivieren, ausgefühn werden. Alle diese Kommandos können auch über ARexx angespro¬ 
chen werden. Dazu ist es notwendig, in Ihrem ARexx-Prngramm die folgende Zeile einzufügen : 

ADDRESS "EDWARD" 

.'Alle folgenden Befehle, die ARexx .selbst nicht interpretieren kann, werden dann an Edward 
geschickt. Welche Befehle dies sein können, erfahren Sie im Mihang) ..Die Kommandos des 
Editors“. Die Befehle in diesem Anhang sind themati.sch geordnet. Im .Abschnitt XIV. des Anhangs A) 
finden Sie zudem spezielle Kommandos, die nur im Zusammenspiel mit ARexx sinnvoll sind. 

3.18 Zurücknehmen von Text-Änderungen 

Mit den Ftttiktionen „Undo“ und „Redo“ erhalten Sie durch Edward die Retter in der Not, die Sic 
w'ahrscheinlich .schon oft vermißt hatten. Wie oft hat man doch schon an einem Text etwas geän¬ 
dert, schnell mal was umkopien oder gelöscht und tlann festgestcllt, daß das eigentlich nicht gerade 
die beste Idee war. Was dann? Natürlich könnte man den alten Text wieder einladen und von 
Neuem beginnen. Wie lästig. 

Zum Glück gibt es die Undo-Funktion in Etlward. Damit können Sie eine von Ihnen vorgegebene 
Anzahl aller Operationen, die einen Text verändert haben, wieder rückgängig machen. 

Mit „Redo“ ist es Ihnen sogar möglich, die Rücknahme der Änderungen wieder zurückzunehmen 
(ganz schön komplex). 

Natürlich macht Etlward das Ganze nicht umsonst. 

Um sich alle Ändemngen merken zu können, braucht er Speicher. Wieviel, daß können Sie mit den 
„Globale Einstellungen“ ebenso wie die .Anzithl der zu merkenden Operationen einstellen. 

«ar Siehe hierzu insbesondere Kapitel 3.15 Globale Einstellungen. 

Um einen kleine Eindruck der „UnDo“-Funktion zu erhalten, probieren Sie einfach das folgenden 
Beispiel aus. 

• Geben Sie folgende Zeile ein: „Das Nichts als Negation des Seins mit dem Potential der 
Realisation der Existenz.“ 


Mhlen Sie nun „UnDo“ aus dem „Extras“-Menü. 



3. EDWARD 


83 


DaraLifliin verschwindet der letzte Buchstabe, tien Sie getippt hatten. 

Sie können dies wiederholen, bis irgendw'ann die Meldung „Everything is undone!" in der Titelzeile 
erscheint. 

• 'Ä'ählen Sie nun „ReDo“ aus dem „Extras“-Menti. Daratifliin erscheint der Buchstabe wieder, 
der durch die vorige Undo-Operation gelöscht wurde. 

• Auch „ReDo“ können Sie wiederholen, bis wieder die gesamte Zeile dasteht. 

Vielleicht laden Sie jetzt mal einen größeren Text ein, schneiden Blöcke aus und kopieren Sie um, 
löschen einige Zeilen und tippen neue Zeichen ein. 


Wenden Sie dann die Tndo-Funktion an. 



Auch die Undo-Funktion stößt einmal an ihre Grenzen. Wenn sehr viel Speicher zum 
Merken von Textveränderungen benötigt wird, dann kann es verkommen, daß 


Edward Speicher, der zum Merken älterer Veränderungen benötigt wurde, freigeben 
muß. Diese Änderungen sind dann nicht mehr rückgängig zu machen. 

Weiterhin können nur so viele .Änderungen gemerkt werden, wie Sie in den „Globalen Einsteller“ als 
L’ndo-Tiefe angegeben haben. Kommen mehr Änderungen zusammen, so werden die ältesten 
Änderungen vergessen. 




4. Syntax _ 

4. Syntax 


85 


4.1 Allgemeines 

4.1.1 Syntaktische Notation 

ln diesem Handbuch wird als Noiation für formale Syntaxdefinitionen EBNF, Niklaus Wirths 
„lixtended Backus Natir Form“, veimmdet: 

"Abc" Der Text zwischen den Anführungszeichen Ist so zu übemehmen. 

Abc Entweder ist hier eine andere Synttix dieses Namens einzusetzen, 

oder im nachfolgenden Text steht eine Erläuterung zu diesem Punkt. 

{...} Der Inhalt der Klammer kann beliebig oft, inklusive Null-mal, gesetzt 
werden. 

[ ... ] Der Inhalt der Klammern ist optional, d. h. er kann entweder genau 
einmal gesetzt otler ersatz.los weggelas.sen werden. 

(...) Runde Klammern dienen zur Gliederung und Strukturiereung des 
Ausdrucks. 

A I B Alternative: Entweder A oder B 
Ein Beispiel: 

" (" Zahl { "," Zahl ) ")" 

Dies ist eine geklammerte Liste von wie auch immer gearteten Zahlen: Am Anfang muK immer eine 
runde Klammer ,,(„ stehen, gefolgt von einer ersten Zahl. Danach kann man beliebig oft jeweils ein 
Komma und eine Zahl schreiben, bevor man am Ende wieder eine Klammer „)“ setzt. 

Folgende Zeilen würden also der Syntax genügen: 

(17,4) 

( 0 ) 

(1, 2 , 3 , 1,-5) 

Wie Sie sehen, dürfen Sie auch Leerzeichen einschieben, obwohl diese nicht in der formalen Syntax 
enthalten sind. Es gilit oft auch den umgekehrten Fall, wie hei der folgenden Switax (die übrigens 
kein sinnvoller Teil von Pascal ist): 

"BEGIN" (Bezeichner I Zahl) "END" 

Hier ist zwischen „BEGIN“ und „END“ wahlweise ein Bezeichner oder eine Zahl zu setzen. Hier 
MUSS man sogar zusätzliche Leerzeichen einRigen: 



MaxonPASCAL 


86 


BEGIN42EHD 

entspräche nicht der Syntax, da dies für den Compiler ein einziger langer Bezeichner wäre. 

Wie ist dieses Problem formal zu lösen? SchlielSllch wollen wir nicht ständig in Syntaxnotationen 
keizeichen und sonstige Trennungen einfügen. 

Der Compiler analysiert den Quelltext auf zw^el Ebenen: der lexikalischen und der syntaktischen, Auf 
der lexikalischen Ebene wird der Text in eine unstrukturierte Folge von Grundsymbolen unterteilt. 

Solche Grundsymbole sind im wesentlichen Bezeichner, Wortsymbole, Integerzahlen, Gleitpunkt¬ 
konstanten, Stringkonstanten und spezielle Symbole wie z. B. das Semikolon oder der 
Doppelpunkt. So würde der Compiler bei der lexiblischen Analyse „BEGIN42END“ als ein einziges 
Grundsymlxrl, nämlich einen Bezeichner, erkennen, Um daraus mehrere zu machen, muß man sie 
irgendwie trennen, ln Pascal dürfen zwischen Grundsymbolen beliebig viele Leerzeichen, 
Zeilenenden, Kommentare usw. stehen, ohne daß der Sinn des Textes dadurch irgendwie 
beeinflußt wird. 

BEGIN 4 2 END 

entspräche unserer Beispiel-Syntax: „BEGI.N“ ist als erstes Symbol klar zu erkennen. Es ftrlgt eine 
Zahl, die zwangsläufig da endet, wo keine Ziffer mehr folgt. Somit ist auch das Symbol „END^^ klar als 
solches zu identifizieren. Jetzt erst wird die syntaktische Analyse durchgefiihrt, die die 
Grundsymbolfolge als korrekt erkennt. 

Wenn nicht ausdrücklich anders angegeben, beschreiben EBNF-Ausdrücke in diesem Handbuch 
Regeln für die syntaktische Analyse, machen alstj Aussagen über die Abfolge vtin PASCAL- 
Grundsymbülen. Dadurch ist also z. B. bei unserer Beispielsyntax 

"BEGIN" (Bezeichner | Zahl) "END" 

inhärent klar, daß das „BEGIN“ vom nachfolgenden Grundsymbol - hier wahlweise eine Zahl oder 
ein Bezeichner - getrennt sein muß, und daß andererseits zwischen den Symbolen beliebig viele 
Leerzeichen, Zeilenenden, Kommentare o. ä. gesetzt werden dürfen. Des weiteren werde ich in 
Zukunft nicht mehr darauf hinweisen, daß in PASCAI, die Groß-Kleinschreibung keine Rolle spielt. 


4. Syntax 


87 


4 . 1.2 Symbole 

Wie iil)cn btTL'its sn^edeutet, gibt cs in PASOM- Wort- und Spezittlsynibolc. Zunächst eine Liste der 
Wortsvmbole; 


.AND 

,UfRAY 

BEGIN 

CASE 

CONST 

DIV 

DO 

DOWNTO 

ELSE 

END 

FILE 

FOR 

FUNCTION 

GO'1’0 

IF 

IN 

[ABEL 

MOD 

NIL 

NOT 

OF 

OR 

PROCEDURE 

PROGRAM 

PACKED 

RECORD 

REPFAT 

SET 

SHL 

SHR 

THEN 

TO 

TYPE 

LINTII, 

VAR 

WHILE 

Wl'FH 

XOR 




MaxnnPASCM. woirde gegenülter dem Standard stark erweiten, was es erforderlich machte, viele 
Wortsymbole zu ergänzen. Nuti können Wortsymbole nicht überdefiniert werden, wodurch es 
dadurch zu Kompatiblitätsproblemen kommen könnte. Deshalb wurden nur drei „echte“ 
Wortsymbole hinzugenommen, nämlich XOR, SHl. und SHR. Alle anderen wmrden als sog. 
Directives realisien. Sic unterscheiden sich von W'ortsymbolen dadurch, daß sie „überdefiniert“ wer¬ 
den können. Hier ist eine Liste dieser Directives. Der Jensen-Wirth-Standard kennt übrigens nur 
eine einzige Directive, nämlich FORW'ARD. 


ABSOLUTE 

Expoirr 

EXTERNAL 

FORW'ARD 

FROM 

IMPLEMENTATION 

IMPORT 

INTERFACE 

LIBRARY 

MODLII.E 

OTHERWISE 

STATIC 

STRING 

UNIT 

USES 



Außerdem gibt es noch Spezialsymbole. Sie bestcheti stets aus einem oder zwei Zeichen, die keine 
Buchstaben sind. Die folgende Liste, die übrigens genau dem Standard entspricht, enthält alle 
Spezialsymibole: 


( ) * 
< < = 


+ 

< > 


= > 


> = 



MaxonPASCAL 


88 


Ersatzschreibweisen: (. für | 

.) für ] 

@ als Ersatz für (Jensen-Wirth) ist nicht möglich, 

4.1.3 Das Semikolon - das ungeliebte Trennzeichen 

Viele genert-te Programmierer wird es freuen, daß MaxonPASCAL so gut wie keine Semikola 
erwaitet, Prmzipiell gilt, daß man sie nur da setzen muß, wo sie als Trennzeichen nötig sind. Man 
sollte sie aber trotzdem setzen (zumal es der „echte“ P,\SC,AL-Freak schon fast im Cnterhew'’ul,^t.sein 
tut): Zum einen kann der Compiler dann die Fehler leichter analysieren und zum anderen bleiben 
die Programme dadurch kompatibel und portabel. Zudem kann und will ich nicht garantieren, daß 
der Compiler ohne Semikola 100%-ig richtig arbeitet (soll heißen, daß er eventuell hier oder da 
Fehler melden könntefl), die keine sintI - die Codeerzeugung dürfte dadurch unberührt bleiben). 

Mit der Option „Semikolon melden“ aus dem Compiler-Requester können Sie sich die Stellen, an 
denen ein fehlt, anzeigen lassen. Die Übersetzung wird dabei nicht abgebrochen. 

4 . 1.4 Kommentare 

Kommentare können wahlweise mit oder “(*“ beginnen und mit “}" oder "*)" enden. 
Geschachtelte Komentare sind möglich. 


4.1.5 Bezeichner 

Bezeichner („Identifier“) dienen in P.ASC.AL dazu, Variablen, Prozeduren und vielen anderen Dingen 
mehr Namen zu geben. Erlaubte Zeichen in Bezeichnern sind: - Buchstaben - Ziffern - der 
Unterstrich Bei MaxonP.ASCxAL zahleti die Umlaute „ä“, „ü“, „ü“ zu den Buchstaben, nicht jedoch 
tias „ß“. Das erste Zeichen eines Bezeichners kann ein Buchstabe oder das Unterstreichzeichen sein. 

Formale Syntax: 

Bezeichner = Buchstabe { Buchstabe | Ziffer } 

Buchstabe = 'a' | -b' | ... | 'z' | 'ä' | 'ö' | 'ü' | 

Ziffer = '0' | •!' | ' 2 ' \ ... | '9- 

Beachten Sie bitte, daß es sich hierbei um eine lexikalische Definition handelt und daß auch hier 
nicht zwischen Groß- und Kleinbuchstaben unterschieden wird. Was in der Syntax nicht zum 
Ausdruck kommt: Wortsymbole wie z. B. „BEGIN“ sind keine Bezeichner. 



4. Syntax 


89 


4.2 Programmkopf 

Die Zeile ..Program..." kann entfallen. Wenn sie aber gesetzt wird, ist die Syntax folgende: 

"PHOGRAM" Bezeichner [ "(" Bezeichner { Bezeichner } ")" ][ '';”a ] 


im Klartext: Nach tiein Scliltisselwort.,Program“ miilS stets ein Bezeichner folgen. Optional bnn 
man dann eine in mnden Klammern eingesdilo.ssene Parameterliste setzen, bestehend aus tlurch 
Komma getrennten Bezeichnern. 


Achtung 





Der Inhalt dieser Liste wird völlig ignoriert und hat keinerlei Bedeutung! Wie fast immer, ist 
auch hier das am Schluß optional. 


4.3 Blöcke 

Ein Block bildet in P,\SCAI. den Rumpf eines Programms hzw. einer Procedure oder Function und 
besteht aus: 

I.abel-Deklarationsteil 
Konstanten-Definitionstcil 
- Typdefinitionsteil 

Variablendeklarationsteil 
Procedure- und Function-Deklarationen 
Bibliotheksdefinitioiicn 
Anweisungsteil 

Der letzte Teil ist der einzige, der immer vorhanden sein muK. alle anderen sind optionttl. 

Bei MaxonP.ASCAL ist die Reihenfolge der Deklarations- und Defmitionsteile teliebig; jeder Teil 
kann auch beliebig oft Vorkommen. Wichtig ist nur, daR am Faide der mit BEGIN ... END timschlos- 
sene .Anweisungsteil kommt. 

Folgendes wäre ein koiTcktcs MaxonP.ASCAl.-Programm: 

{ "Program"-Kopf weggelaasen ) 

Const diff=7; 

Procedure p(Var i:integer); 

Begin 

writeln(i); l:=i-diff 
End; 

Type ttyp=integer; 


Var v: ttyp; 




MaxonPASCAl. 


90 


Const con=0815( 

Begin 

v:=con; p(v); p(v) 

End. 

Der Punkt am Programmeiule ist übrigens auch nicht unlretlingt nötig. 
Formal sieht das Ganze dann so aus: 


Deklarationatell= { Labeldeklaration | Konstantendefinition I 
Typdefinition | Variablendeklaration | 
Prozedurdeklaration | Librarydefinition 

Block = Deklarationsteil Anweisungsteil 

Programm = [ Programmkopf ] Dses-Deklaration Block 

[ ] 

Zu den meisten hier auftretenden Begriffen wie „Variablcndeklaration“, „Librar>'iiefmitiün" oder 
.Anweisungsteil" finden Sie im weiteren Verlauf dieses Handbuchs ausführliche Erläuterungen. Was 
eine „Uses-Deklaration" ist, erfahren Sie im Kapitel über Units. 

4.4 Label 

Jedes Label, das benutzt wird, muß zuvor deklariert werden, Die Syntax eines Label-Deklarationsteils 
ist: 

Labeldeklaration = "LABEL" Marke { Marke } [ ] 

Marke = Bezeichner | Ziffernfolge 

Ein Label („Marke“) ist entweder eine Integer-Konstante oder ein Bezeichner. Das Label muß auf 
der Ebene deklarien werden, auf der es gesetzt wird: Man darf z. B. nicht ein Label im 
Hauptprogramm deklarieren und dann im Miweisungsteil einer Prozedur setzen. 

4.5 Konstanten und Konstantendefinition 

Syntax für Konstantendefinition: 

"CONST" Name "=" Konstante { { ) Name "=" Konstante } t " ;" ] 

„Name“ ist ein Bezeichner, „Konstante“ normalerweise ein Literal. .Näheres entnehmen Sie bitte den 
Kapiteln über tlie jeweiligen Datentypen. 

Eine Konstante kann in .MaxonPASCM. ater auch ein Ausdruck sein, in dem nur konstante 
Operanden und bestimmte Ojteratoren auftreten. Im Ganzzahl-Bereich können alle einstelligen 


4. Syntax 


91 


(NOT, -) und zweistelligen ( + , *, mod, shr, ...) Operatoren in Konstanten benutzt werden, 
außerdem die folgenden Funktionen (natürlich nur mit konstanten Parametern): 

Abs ehr Ord Fred SizeOf Sqr Succ 

Succ, Pred und Ord werden auch hei konstanten Parametern der anderen geordneten Datentypen 
(Char, Boolean, Aufzählungstypen) ausgew'ertet. 

Real- und String-Ausdrücke werden nicht vom Compiler ausgewertet und können deshalb nicht als 
Konstante benutzt werden. Die einzigen Operatoren, die bei Real-Konstanten erlaubt sind, sind „+“ 
und als Vorzeichen. Ai.so sind 

Const n = 17 + 4; 

nQuadrat = Sqr (n); 

R = 17.4; 
minusR = -R; 
s = '17 plus 4'; 

korrekt definierte Konstanten, 

Const r = 17 + 0.4; { Real-Ausdruckl } 

s = ' Guide' '42'; { String-Ausdruck 1 } 

jedoch nicht. 

Außer in Konstantendefmitionen treten Konstanten noch an einigen anderen Stellen auf, z. B, in 
Typdeklarationen (Ausschnittstepen, z. B. als ARR.AY-lndextyp) und als Sprungmarke in der C'kSE- 
Anweisung. 

.Auch hier gelten die selben Regeln für Konstanten-Ausdrücke, so daß also Deklarationen wie 

VAR Feld: Array [1. .40-I-2] of Set of 0 .. 1 shl 6 - 1; 

erlaubt sind. 

4.6 Typdefinition 

ln PASC-AL kann man sich Datentypen selbst definieren. Um nicht immer wieder dieselbe 
Typbeschreibung schreiben zu müssen, kann man dem Daientyiien einen Namen geben. Dies 
geschieht im Typ-Definiiionsteil eines Blocks: Auf der linken Seite eines Gleichheitszeichens steht 
der gewünschte Name, auf der rechten Seite die Typbeschreibung. Von dieser Stelle an ist der defi- 
niene Typ unter diesem Namen im aktuellen Block verfügbar. 

Syntax für Typdefinitionsteil; 

"TYPE" Name "=" Typ t [ ";" ] Name "=" Typ } [ ";" 1 

Den zahlreichen Datentypen ist ein Extra-Kapitel dieses Handbuchs gewidmet. 


MaxonPASCAL 


92 


4.7 Variablendeklaration 

Jede Variable, die benutzt wrd, muß zuvor deklariert werden. Dies ge.sehieht im Variablen- 
DekJarationsteil eines BJr)cks. jede Variable hat einen Namen, der (natürlich) ein Bezeichner ist, und 
einen Datentypen, z. B. „Integer", „Real" txler auch ein selbsidefinierter Datentyp. 

Zur Syntax: 

variablendeklarationsteil = "VAR" { Variablendeklaration 

I ] } 

Variablendeklaration = 

Namenaliste " : " Typ [ [ ]( "IMPORT" | "EXPORT" | "STATIC" ) ] | 

Name ":" Typ "ABSOLUTE" Konstante 

Namensliste = Name { "," Name } 

Name = Bezeichner 

Es gibt also mehrere Arten von Variablen: 

* Die normalen Standardpascal-Variablen. Sie werden durch eine mit abgeschlossene 
Bezeichnerliste und daliinterstehendem Typ deklariert. 

Beispiel: a, b, abc: ARRAY [26..731] OF Char; 

Der Compiler wird angewiesen, zur laulzeit beim Betreten des Blocks, in dem diese Variablen 
deklarieit sind, auf dem Stack für tlie Variablen Platz einzurichten, 

• Pseudo-Variablen, tlie an feste Speicheradressen gebunden sind. Hier besteht die Deklaration 
aus einem einzelnen (!) Bezeichner, dem wie üblich ein Doppelpunkt und ein Datentyp folgen. 
Dahinter stehen dann (ohne trennendes Semikolon!) die Directive ..Absolute“ und die 
gewünschte Speicheradresse in Form einer ganzzuhligen Konstanten. 

Beispiel: Hintergrund: integer ABSOLUTE $dffl80; 


Solche Variablen sind vor allem bei der Programmierung der Hardware interessant; Im obigen 
Beispiel entspricht die Variable „Hintergrund" dem Speicherwort an der Adres.se $dffl80 und 
somit dem Register des Grafikchips, das die Hintergrundfarbc des Bildschirms enthält. Wenn 
Sie dieser Variablen einen Wert zuw'eisen, ändert sich die Farbe entsprechend - einmal davon 
abgesehen, daß das Betriebssystem Ihnen dazwischenpfuscht und in schneller Folge den alten 
Wen wiederherstellt. 

Es gibt zwei vortlefinierte ABSOLUTE-Variableii: „Mem" ist definien als „Meni: Array 
|O...MaxLongInt] of Byte Absolute 0“, repräsentiert also den gesamten Hauptspeicher, und 
„SysBase“ enthält durch ihre Deklaration als „Sysßase: Ptr Absolute 4“ einen Zeiger auf die 
ExccBase-Struktur. 



4. Syntax 


93 


Solche maschinennahen Programmierungen dürften die einzigen sinnvollen Anwendungen von 
ABSOLLITE-Vaiiablen sein, denn ein anständiger Programmierer benutz.! niemals feste Adressen 
- schon gar nicht auf dem .'\MIGA! 

• Statische Variablen, die im Gegensatz, zu den normalen Variablen bereits beim Programmstart 
eingerichtet werden. Sie belegen keinen Stack-Platz, sondern werden an anderer geeigneter 
Stelle im Speicher abgelegt. Das macht sich bemerkbar, wenn eine statische Variable lokal in 
einer rekursiven Prozedur oder Funktion dekhiriert werden. Bei einer Rekursion wird Rir sie 
dann keine „neue“ Variable eingerichtet. 

Variablen werden als statisch deklariert, indem man hinter ihre Deklarationszeile die Directive 
„STATIC“ setzt. 

Beispiel: VAR y, x: Real; STATIC; 

a: STRING[20t; STATIC; 

Im Ktipitel „Units und Module“ ist den statischen Variablen ein .\l\schnitt gewidmet. 


• Modulüberschreitende importierte oder exportierte Variablen. Die.se Variablen sind immer auto- 
mati.sch statisch. Näheres über diese Variablenart finden Sie im Kapitel ülier Module. 

4.8 Prozeduren und Funktionen 

P.VSC.AI. kennt zwei Arten von Unteiprogrammen: Procedures und Functions. Sie dienen jeweils 
dazu, ein Programm in kleinere Einheiten zu gliedern und ,so überschaubarerzu machen. Außerdem 
sjiart man sich Tipparbeit, wenn man einen öfter identisch oder ähnlich auftretenden Programmteil 
als Pixjzedur deklariert. Es gibt aber auch viele andere Probleme, z. B. inhärent rekursive, die man 
ohne Prozeduren und Funktionen kaum lösen könnte. 


4.8.1 Allgemeines über Prozeduren 

Eine Prozedur wird im Deklarationsteil eines Blocks deklariert. Sie wird mit dem Prozedurkopf ein¬ 
geleitet, der im einfachsten Fall aus dem Wortsymbol „PROCEDLIRE“ und dem Namen besteht und 
mit einem Semikolon abge.schlossen werden sollte: 

PROCEDURE Beispiel; 

Danach folgt der Prozedurrumpf, ein Block. Eine Prozedur kann lokale Variablen, Konstanten, 
Datentypen usw. haben. Es ist sogar möglich, Prozeduren und Funktionen beliebig tief ineinander 
zu verschachteln (genaugenommen ist diese Schachtelimgstiefe in MaxonPASCAL auf die Tiefe 16 
beschrankt, aber in der Praxis ward man wohl kaum über eine Tiefe von 3 otier 4 hinauskommen). 

Eine Prozedur w'ird aufgerufen, indem man an der aufrufenden Stelle einfach ihren Namen .setzt. 


MaxonPASCAL 


94 


Ein Beispiel: 

PROGRAM ProzedurDemo; 

VAR X, y: integer; 

PROCEDURE PI; 

VAR y: Real; 

BEGIN 

y:= 42; 

wrlteln ('Prozedur PI', x:10, y:10); 

END; 

PROCEDURE P2; 

VAR x: integer; 
z: Char; 

PROCEDURE Q; { lokale Prozedur von "P2" } 
VAR y: Integer; 

BEGIN 
x:= 1; 

y:= 2 ; 
z:= '?'; 

writeln('Prozedur Q', xilO, y:10, z:10) 
END; { Ende von "Q" ) 


BEGIN ( Anweisungsteil von Prozedur P2 } 
x:= 26; 
y:= 731; 
z : = ' A' ; 

wrlteln('Anfang P2', x:10, yslO, z:10); 

Q; 

wrlteln('P2 nach Q', x:10, y:10, z:10); 
PI; 

writeln('Ende P2 ', x:10, y:10, z;10) 
END; 

BEGIN { Hauptprograimn } 
x:= 47; 
y:= 11; 

wrlteln ('Progreunmstart ', x:10, y:10); 

PI; 

writeln('Mitte Hauptprogramm', x:10, y:10); 
P2; 

wrlteln('Programmende 
END. 


x:10, y:10) 


4. Syntax 


95 


Dieses Programm gibt folgendes aus; 


Programmstart 
Prozedur PI 
Mitte Hauptprogramm 
Anfang P2 
Prozedur Q 
P2 nach Q 
Prozedur PI 
Ende P2 
Programmende 


47 

11 


47 

42 


47 

11 


26 

731 

A 

1 

2 

? 

1 

731 

? 

47 

42 


1 

731 

? 

47 

731 



Wie funktioniert das Ganze? Wir haben ein Hauptprogramm mit zwei Prozeduren, von denen eine 
Wiederrum eine lokale Prozedur enthält. Alle Prozeduren haben lokale Variablen. Man kann sieh das 
so vorstellen: 


Beispiel __ 

VAR x: integer 
y: integer 


PI 

VAR y: Real 


P2 

VAR x: integer 
z: Char 


Q 

VAR y: integer 


Zunächst einmal fällt auf, dalS Variablen scheinbar doppelt deklariert werden und dxs auch noch mit 
verschiedenen Datentyiien! Das hängt mit den folgenden Regeln über die Gültigkeitsbereiche von 
Bezeichnern zusammen, 

1. Das Hauptprogramm und alle Prozeduren haben jeweils eine eigene „Schachtel“ für ihre 
Bezeichner. Da Prozeduren wieder selbst als lokale Prozeduren verschachtelt w'erden können, 
gibt es eine Hierarchie von Schachteln: Ganz „oten“ ist die Schachtel des Hauptprogramms, 
unter der die Schachteln, der im Hauptprogramm deklarierten Prozeduren stehen, unter wel¬ 
chen jeweils die darin lokal deklarierten Schachteln stehen uswc 




MaxonPASCAL 


96 


2. ln jeder Schachtel sind die Bezeiciincr aus höheren Schachteln bekannt. Sic können aber inner¬ 
halb dieser Schachtel »iiberdefiniert“ werden. Eine obere Schachtel merkt grundsätzlich nichts 
von den Bezeichnern der ihr untergeordneten Schachteln. 

3. Ein Bezeichner ist „lokal“ zu der Schachtel, in der er deklariert wird und „global“ zu allen tiefer 
liegenden Schachteln. In höheren Schachteln ist er nicht bekannt. 

Nun können wir anfangen, das Beispielprogramni Schritt für Schritt durchzugehen. Zunächst wäre 
da das Hauptprogramm mit den Variablen ,x“ und „y“, jeweils vom Typ „Integer“. Von den 
Variablen, die in den Prozeduren deklariert werden, „weiß“ das Hatiptjirogramm nichts, so daß die 
Variablen „x“ und „y“ zunächst ganz normal einen Wen erhalten und ausgegeben werden. 

Jetzt W'ird aber die Prozedur „PI“ aufgerufen. Dort ist eine Variable „y“ definiert, und es wird die 
interessante Wertzuweisung .,y:= 42“ au.sgeführt. Die lokale Definition hat Vorrang vor der gk.iba- 
len, also bezieht sich diese Wertzuweisung auf die innerhalb ,.PT' tleklarierte Real-Variable. Die.se 
Variable wirti dann auch ausgegeben, ebenso eine Variable „x“. Dazu gibt es im .Moment nur eine 
Deklaration; die globale Integer-Variable des Hauptprogramms. Also wird deren Wert (47) ausgege¬ 
ben. 

Nach Ende tles Anweisungsteils von „PI“ kehren wir in das Hauptprogramm zurück. Die Variablen 
„x“ und „y“ haben noch die.selben Weite wie zuvor (47 und 11). ln „PI“ wurde zwar eine 
Wertzuweisung an „y“ vorgenommen, diese bezieht sich aber auf die dortige lokale Variable, die mit 
dem gleichnamigen globalen „f nichts zu tun hat. 

Nun wird die Prozedur ,.P2“ ausgeführt. Dort werden als erstes Wertzuweisungen an „x“, „y und X 
durchgefiihrt. Analog zum ersten Prozeduratifruf können Sie sich klarmachen, daß „,x“ und X loka¬ 
le Variabein sind, während ,.y“ sich hier auf den globalen Bezeichner bezieht. Es wird hier also in 
einer Prozedur der Wert einer globalen Variablen geändert. So etwas nennt man einen 
„Seiteneffekt“ dei' Prozedur (tilso eine auf den ersten Blick nicht erkennbare Auswirkung der 
Prozedur auf den Gesamt-Programmablauf) und sollte möglichst vermieden werden - im nächsten 
.4bschnitt erfahren Sie, wie man so etwas mit Hilfe von „Parametern“ sauber machen kann, 
jedenfalls ward hier 26, 731 untl „A“ au.sgegeben, bevor ,.Q“ ausgeführt wird. Dort passiert nicht 
mehr viel Neues: Eine lokale Variable „y“ wirti eingerichtet, und es gibt einen Seiteneffekt auf die 
Variablen „x“ und „z“ der Prozedur „P2“. Nach Rückkehr aus „Q“ nach „P2“ haben diese Variablen 
also plötzlich einen anderen Wert. 

Nun geschieht etwas Interessantes: Die Prozedur „PI“ wird aus „P2“ heraus aufgerufen, Das ist mög¬ 
lich, tienn der Bezeichner „PI" ist ja global, d. h. in der Schachtel des Hauittprogramms, deklariert 
und somit in der Schachtel von „P2“ bektmnt. Dort wird w'ieder die wohlbekannte Zuw'cisung an das 
lokale „y“ durchgeführt und X ausgegeben. Welches „.x“ ist nun gemeint - das des 
Hauptprogramms oder das der aufrufenden Prtizetlur „P2“? ln P.ASCAL gibt es den Begriff des ..stati¬ 
schen“ untl tles „dynamischen“ Vorgängers einer Prozetlur. Statischer Vorgänger von „PI“ ist immer 
das Hauptprogramm, denn tlarin ist die Prozedur ja deklariert. Dynamischer Vtirgänger ist jew'eils 
die aufrufentle Schachtel, ln diesem Fall, also beim zweiten Aufruf, ist die Prozetlur „P2“ tlyntimi- 
scher Vorgänger. Die Itlentifikatitm von Bezeichnern w'irtl bereits vom Compiler vorgenommen, 


4. Svntax 


97 


muß sich also auf den statischen Vorgänger Ireziehen, denn der dynamische steht ja erst zur laiuf/eit 
der Prozeilur fest. Also bezieht X siclr hier wieder auf die Variable des Hauptprogramms und nicht 
die des dynamischen Vorgängers „P2", so daß wieder 47 ausgegeben wird. 

Da .,P1“ keine Seiteneffekte hat, haben sich nach Kückkehr von dort in die Schachtel von „P2‘' keine 
Variablenwerte geändert. Nach dem Ende von „P2“ und tiem Riicksprung ins Hauptprogramm hat es 
aber einen Seiteneffekt auf die globale Variable „y“ gegeben, so daß jetzt ein anderer Wert ausgege¬ 
ben wird, 

ln der Praxis wird man natürlich keine so komplizierten Schachtelungen verwenden und nur in 
Ausnahmefällen globale Bezeichner iiberdefinieren. 

4.8.2 Parameter 

Es wurde bereits erwähnt, daß man Seiteneffekte aus Gründen der Lesbarkeit des Listings vermei¬ 
den sollte. l.'m in der Deklaration der Prozedur deutlich zu machen, wovon der Prozedurverlauf 
abhängt und welche globalen Grüßen er beeinflußt, gibt es die Parameter. 

PASCAL kennt zwei .Arten von Parametern: Wertparameter („Call by value") und Variablenparameter 
(„Call by reference“). Andere exoti.scbe Programmiersprachen kennen auch „Call by name‘" (z. B. 
Siniula, .Macros in Assembler) oder „Call by value and return“ (z. B. Fortran), aber es ist gewiß kein 
Verlust, daß uns jene Übergabearten in PASCAL erspan bleiben. 

Der Witz hat zwar einen Bart, aber hier ist er trotzdem für alle, die ihn noch nicht kennen: PASCAL- 
Erfinder Niklaus Wirth auf die Frage eines Amerikaners, wie man denn .seinen Namen aussprechen 
solle: „You can call me by name, Wirth, or by value, Worth.“ 

4.8.2.1 Wert-Parameter 

Das folgentle Programm enthält eine Prozedur, die tien größten gemeinsamen Teiler („ggT"") zweier 
Zahlen nach dem Euklidischen .Algorithmus berechnet und ausgibt. Damit die Prozedur „weiß“, w^el- 
che beiden Zahlen gemeint sind, werden diese als Parameter übergeben: 

PROGRAM Euklid; 

PROCEDURE ggT (a, b: integer); 

VAR hilf: integer; 

BEGIN 

WHILE aoO DO 
BEGIN 

hilf:= abs (a); 
a:= b MOD a; 
b:= hilf; 

END; 

wrlteln(b) 

END; 

BEGIN 

write ('Der ggT von 17 und 4 ist '); ggT (17, 4); 



MaxonPASCAI, 


98 


write ('Der ggT von 12 und 16 ist '); ggT <12, 16); 
write ('Der ggT von 42 und 4711 ist '); ggT (42, 4711); 

END. 

Man kann also in dem Prozedurkopf eine sog. Paramcterliste aufnehmen. In unserem Beispiel wer¬ 
den in der Prozedur zwei lokale Variablen „a“ und „b“ des Typs Integer eingerichtet. Beim Aufruf der 
Prozedur ist dann anzugeben, mit welchen Werten diese Variablen vorbesetzt werden sollen: Beim 
ersten Aufruf erhält „a“ den Wert 17 und „b" wird 4 zugewiesen usw. Diese Parameter verhalten sich 
ansonsten wie ganz normale lokale Variablen der Prozedur, z. B. kann man ihnen - wie im Beispiel 
geschehen - einen neuen Wert zuweisen usw. 

Die „aktuellen Parameter“ (also die Werte, die man beim Prozeduraufruf angibt) können beliebig 
komplexe Ausdrücke sein, sie müssen aber zu den „formalen Parametern“ (also dem, was in der 
Prozedurdeklaration in der Parameteriiste steht) wertzuweisungskompatibel sein. 

Wenn in der formalen Parameterliste mehrere unterschiedliche Parameter stehen sollen, sind diese 
mit einem Semikolon zu trennen, z. B. so; 

PROCEDORE Multipara (Zahl: Real; cl, c2: Char; Flag: Boolean); 

Beim Aufruf müssen die aktuellen Parameter aber nichtsdestotrotz durch Komma getrennt werden, 
etwa: 

Multipara (x+2, 'A', chr(i+32), b); 

ln der fomialen Parameterliste müssen Datentypen grundsätzlich in Form eines Typbezeichners 
angegeben werden: 

PROCEDDRE Pr(St: STRING[50)); 

wäre also FALSCH! 

„STRl.NG“ allein ohne Längenangabe (d. h. mit Default 80) ist streng genommen kein 
Typbezeichner. Es kann hier aber als solcher verwendet werden. 

4.8.2.2 Variablenparameter 

.Angenommen, wir wollen den ggT nicht ausgeben, sondern weiter mit ihm rechnen. Beispielswei.se 
könnten wir ihn brauchen, um einen Bmch zu kürzen. Es gibt verschiedene Arten, wie eine 
Prozedur einen Wert zurückgeben kann; Seiteneffekte auf globale Variablen (sollte man besser sein 
lassen), Funktionen (siehe nächster Abschnitt) und V.AR-Parameter. 


99 


4. Syntax ___ 

In unserem ggT-Beispiel könnte das so aussehen: 

PROCEDORE ggT (a, b: integer; VAR Ergebnis: integer); 

VAR hilf: integer; 

BEGIN 

WHILE aoO DO 
BEGIN 

hilf:= abs (a); 
a:= b MOD a; 
b:= hilf; 

END; 

Ergebnis:= b; 

END; 

Der Variablen-Parameter wird also wie ein Wert-Parameter deklariert, nur dal.^ davor das 
Schlüsselwort „VAR" gesetzt wird. In der aktuellen Parameterliste ist für den VAR-Parameter eine 
dazu typkompatible Variable anzugeben, etwa so: 

VAR n: integer; 
ggT(42, 4711, n) ; 

writelnt'Der ggT von 42 und 4711 ist n); 

Beim Aufruf der Prozedur „ggT“ erhält der formale Parameter „Ergebnis“ eine „Referenz“ auf die 
aktuelle Parameter-Variable „n“. Das bedeutet: eine Variable namens „Ergebnis“ gibt es überhaupt 
nicht, sie ist nur ein anderer Name für den formalen Parameter. Wenn an „Ergebnis“ ein Wert zuge¬ 
wiesen wird, erhält in Wirklichkeit der aktuelle Parameter einen neuen Wert. Die beiden Variablen 
sind für die Dauer der Prozedurabarbeitung identisch. 

Ein anderes Beispiel: Eine Prozedur soll einen Bruch, der als Nenner und Zähler übergeben wird, 
kürzen. Wir verwenden dazu wieder unsere „ggT“-Prozedur. 

PROGRAM Bruch; 

VAR nenn, zaeh: integer; 

PROCEDURE ggT (a, b: integer; VAR Ergebnis: integer); 

VAR hilf: integer; 

BEGIN 

WHILE aoO DO 
BEGIN 

hilf;= abs (a); 
a:= b MOD a; 
b:= hilf; 

END; -v 

Ergebnis:= b; 

END; 

PROCEDURE Kürzen (VAR Zähler, nenner: integer); 

{ Die Parameter durch ihren ggT teilen. Wenn nenner=0, 

Fehler melden. Bei zähler=0 den Nenner auf 1 setzen. } 



MaxonPASCAL 


100 


VAR g: integer; 

BEGIN 

IF nenner=0 THEN 

error ('Zähler ist Nulll') 

ELSE 

IF 2ähler=0 THEN 
nenner:= 1 
ELSE 

BEGIN 

ggT (Zähler, nenner, g); 
nenner;= nenner DIV g; 

Zähler:= Zähler DIV g 
END 

END; 

BEGIN { Hauptprogramm} 

write('Bruch eingeben: '); readln (zaeh, nenn); 

Kürzen (zaeh, nenn); 

writeln('ge)cürzt: ', zaeh, ' / nenn) 

END. 

Düs Programm tut das Gewünschte. 

Wir haben es wirklich mit einem „Call by reference“ zu tun, nicht mit „Call by name". Beispiel: 

PROGRAM Kleinlich; 

VAR i: integer; 

a: ARRAY [ 1..2 ] OF integer; 

PHOCEDDRE Proc (VAR Para: integer); 

BEGIN 
i:= 2; 

Fara:= 42 
END; 

BEGIN 

a[i: := 1; a[2] := 2; 
i:= 1; 

Proc (a[i]); 

writeln(a [1] : 5, a[2]: 5) 

END. 

Quizfrage: Was gibt dieses Programm aus? 

Antwort: 42 

Beim Aufruf erhält „Parä“ eine Referenz auf „a[i]“ - und das ist zu diesem Zeitpunkt „a|l]“. Deshalb 
wird „42“ auch an „a[l)“ zugewiesen, obwohl inzwi,sehen „i" einen anderen Wert erhalten hat. Beim 
sog.“Call by name“ würde einfach für „Para“ jeweils „a|i]“ einge.setzt, so daß dann „a|2j“ den Wert 42 
erhalten würde. 


4. Syntax 


101 


4.8.3 Funktionen 

Funktionen sind Prozeduren, die einen Wert zurückgeben. Der Aufruf einer Funktion ist daher kein 
Befehl, sondern Teil eines Ausdrucks. 

Ihre Deklaration ist identisch mit der Prozedur-Deklaration, aber statt „PROCFd)lJRF;' ist das 
Schlüsselwort „FUNCTION“ zu vei^cenden unti am Fnde des Kopfs ist der Typ des Rückgabewerts 
anzugeben: 

FUNCTION ggT (a, b: integer): integer; 

VAR hilf: integer; 

BEGIN 

WHILE aoO DO 
BEGIN 

hilf:= abs (a); 
a:= b MOD a; 
b:=: hilf; 

END; 

ggT:= b; 

END; 

Irgendwo im Anweisungsteil der Funktion - oder einer untergeordneten lokalen Prozedur oder 
Funktion - muls der Rückgabewert definiert werden, indem er dem Funktionsnamen zugewie.sen 
wird. 

Ein Aufruf dieser Function könnte so aussehen: 

writelnt'Der ggT von 42 und 4711 ist: '# ggT(42,4711)); 


Oder SO: 

nenner:= nenner DIV ggT<nenner, Zähler); 

Der Rückgabetyp muK in Form eines Typbezeichners angegeben werden. Auch hier ist „STRING“ als 
Pseudo-Bezeichner möglich. 

Während Parameter grundsätzlich von jedem beliebigen Typ sein können, sind die Rückgabewerte 
von Functions auf „skalare“ Typen beschränkt. Erlaubt sind: 

- Numerische Datentypen (ganzzahlig und Gleitpunkt) 

- CHAR, STR, Stringtypen 

- BOOLEAN 

- Aufzählungs- und Ausschnittstypen 
Pointertypen 



MaxonPASCAL 


102 


4.8.4 Prozedurparameter und andere Spezialitäten 

MaxonPASCAL kennt keine Conformant Array Parameter. Dieses empfohlene Extra des ISO- 
Standards ermöglicht es, Arrays mit variablem Indexbereich als Parameter zu übergeben. Man kann 
sieb aber mit typfreien Zeigern behelfen (siehe Kapitel 5.6 Pointertypen). 

Beispiel: 

PROORAM CAP_ErBatz; 

VAR i; integer; 

a: ARRAY[1,.10] OF integer; 

PROCEDURE SorttArrayzelger: Ptr; FeldAnzahl: integer); 

VAR ap: ''ARRAY [0. .MaxInt] of integer; 
i, j: integer; 

BEGIN 

ap:= Arrayzeiger; 

{ Achtung, Array geht von 0 bis Feldanzahl-1 } 

FOR i:= FeldAnzahl-2 DOWNTO 0 DO 
FOR j:= 0 TO i DO 
IF ap^ [ j ] > ap''[ j + 1 ] THEN 
Exchange(ap*[ j ], ap*[ j+1 ]) 

END; 

BEGIN 

FOR 1:=1 TO 10 DO a[i]:= randomt1000); 

Sort(*a, 10); 

FOR i:=l TO 10 DO writeln{a[ i ]); 

END. 

Dieses Programm simuliert einen Conformant Array Parameter, indem ein Zeiger auf das Array 
(MaxonPASCAL-Spezialität!) und die Anzahl der Elemente übergeben wird. Beachten Sie aber, daß 
sich der Indexbereich ändert: a[l] entspricht ap ^ [Oj. 

Man kann auch Prozeduren und Funktionen als Parameter übergeben. Formal sieht das so aus, daß 
man in die formale Parameterliste einen Prozedur- cxler Funktionskopf schreibt, ln der aktuellen 
Parameterliste ist dann nur noch der Name der Prozedur oder Funktion anzugeben. 

Beispiel: 

PROGRAM FuneParam; 

PROCEDDRE ab(FDNCTION f(x:Real):Real); 

VAR i:integer; 

BEGIN 

FOR i!=0 TO 10 DO 

writoln(i/5:5!l, f(i/5):12:6); 
writeln; 

END; 

BEGIN 

writeln('Sinua:■); 


Tab(Sin); 



4 . Syntax 


103 


writelnt'Cosinus:'); Tab(Cos) 

EHD. 

Dieses Programm druckt Wenetabellen der Funktionen Sin und Cos. Ein weiteres Beispiel zu die¬ 
sem Thema finden Sie in den Beispielen unter dem Namen Jntegra.p“. 

Bei rekursiven Problemen kommt es manchmal vor, daß zwei Prozeduren oder Funktionen sich 
gegenseitig aufrufen müssen. Die einfachste läsung wäre, wenn man die Prozeduren ineinander 
verschachtelt. Falls das aus irgendwelchen Gründen nicht möglich ist, kann man das Problem über 
„FORWAIUT'-Referenzen lösen. 

Dabei schreibt man von der ersten Prozedur oder Funktion zunächst nur den Kopf, gefolgt von 
„FORWARD“, Nun „weiß“ der Compiler, dalä es diese Prozedur gibt und wie ihre Parameterliste aus- 
sehen soll. Nun kann man die zweite Prozedttr und was auch immer schreiben, bevor man irgend¬ 
wann vor Ende des Deklarartionsteils den Block der ersten Prozedur „nachträgt“. Er wird eingeleitet 
mit dem Kopf dieser Prozedur, aber ohne Parameterliste und (bei Funktionen) Ergebnistyp. 

Das folgende Beispiel enthält zwei Funktionen, die auf besonders umständliche Weise feststellen, 
üb eine Zahl gerade bzw. ungerade ist: 

PROGRAM Forwarded; 

VAR i: Integer; 

FUNCTION Dng(n: integer): Boolean; FORWARD; 

FUNCTION Ger(n: integer): Boolean; 

BEGIN t "n" ist gerade, wenn n=0 gilt oder n-1 ungerade ist. ) 

IF n=0 THEN 
Ger:= true 
EDSE 

Ger:= Ong(n-l) 

END; 

FUNCTION Dng; 

BEGIN { Eine Zahl ist ungerade, wenn ihr Betrag nicht 
gerade ist. ) 
üng:= NOT Ger(abs(n)) 

END; 

BEGIN 

write ('Bitte ganze Zahl eingeben: '); 
readln <i); 

IF ger(i) THEN 

writeln('Gerade.') 

ELSE 

writelnt'Ungerade.') 


END. 



MaxonPASCy. 


104 


4.8.5 Zusammenfassend: Syntax 

Hier ist die vollstänciigc Syntax für Prozedur- und Funktions-Dekiarationen: 

Prozedur/Funktionedeklaration 

= ProzFunkKopf (("FORWARD" | "IMPORT" | 

"EXTERNAL") ";" | ["EXPORT" ">"] Block) 

ProzFunkKopf = {"PROCEDLtRE" Bezeichner ( Formale 

Parameterliste ] [ ";" ]) | ("FUNCTION" 

Bezeichner [ FormaleParameterliste ] 

[ Typbezeichner ] [ ";" J) 

FormaleParameterliste 

= "(" Formalerparameter [ Formaler 

Parameter ) ")" 


FormalerParameter 


= ([ "VAR" ] Bezeichner { 

TypBezeichner) | ProzFuntcKopf 


Bezeichner } 


Zu „i.MPORT“, „EXPORT“ und „EX'i'ERNAL“ finden Sie im Linker-Kapitel nähere Erläuterungen. 


4.9 Anweisungsteil 

Der Anweisungsteil eines Blocks besteht aus einer mit BEG1N...END geklammerten Folge von 
Befehlen. Er ist der einzige Teil, der in einem Block nie fehlen darf. 

Syntax: 

Anweisungsteil = "BEGIN" Anweisung { [ ] Anweisung ) "END" 

Es gibt viele verschiedene .Arten von Anweisungen, was auch in unserer EBNF-Syntax zum Ausdruck 
kommt: 

Anweisung = [ Marke ":" ] [ Wertzuweisung | Prozeduraufruf | 

Verbundanweisung | Fallunterscheidung | REPEAT-Schleife ( 
WHILE-Schleife 1 FOR-Schleife I CASE-Anweisung | 
WITH-Anweisung | GOTO-Sprung ] 

Vor jeder Anweisung kann also eine Sprungmarke stehen, und eine Anw'eisung kann grundsätzlich 
auch leer sein. 



4. Syntax 


105 


4.9.1 Wertzuweisung 

Syntax; variable “ Ausdruck 

Der Ausdruck muß zur Variablen werczuweisungskompatibel sein. Dabei gelten folgende Regeln; 


Variable _ 

Ganzzahlig 

Real, Double 

Char 

Boolean 

Aufzählungstyp 

Pointer 

Referenztyp 

Str 

SET 

STRING[n] 

ARRAY 

Elementtyp 

RECORD 


Ausdruck _ 

beliebiger Ganzzahltyp, auch andere „Breite“ 
numerisch 

Char-Konstante, -Variable, -Funktion 
Boolean 

Ausdruck desselben Aufzählungstypen 

typfreier Zeiger, „NIL“ oder Zeiger mit typkompatiblem 

Char- oder Str-Ausdruck, STRING-Variable, String-Konstante, 
keine String-Ausdrücke! 
beliebiger Mengenausdruck 
Char- oder Stringausdruck 

Array-Variable mit gleichem Indextyp und typkompatiblem 

gleicher Recordtyp, oder strukturgleicher Record mit jeweils 
typkompatiblen Feldern 


In der Tabelle taucht des öfteren der Begriff der „Typkompatibilität" auf. Diese Kompatibilität ist 
strenger definiert als der Begriff der Wenzuweisungskompatibilität; hier müssen skalare Typen 
zusätzlich die gleiche „Breite“ haben. Falls Sie in der Übersicht die Ausschnittstypen vermißt haben; 
Sie werden mit ihren jeweiligen Grundtypen identifiziert. Ein Datentyp wie „1..10000“ wäre also 
sowohl wertz.uweisungs- als auch typkompatibel zu „Integer“. 


4.9.2 Prozeduraufruf 

Es gibt vordefinierte Standardprozeduren (siehe Kapitel 7) und selbstdefinierte Prozeduren, wie im 
W Airschnitt 8 dieses Kapitels dargestellt wurde. Beim Aufruf sind diese beiden Prozedunypen völlig 
gleichgestellt: 

Prozeduraufruf = ProzedurBezeichner [ Pareuneterliete | 

Write-Parameterliste e ] 

Paranieterliste= "(" Ausdruck { Ausdruck } ")" 

,4bgesehen von „Write“ und „Writel.n“ sehen Parameterlisten also stets gleich aus. Allerdings ist es 
bei vordefinierten Prozeduren oft so, daß der genaue Inhalt von Parameterlisten, z. B. Anzahl oder 
Datentyp der Parameter, nicht fest ist. 

.'Vlies über vordefinierte Prozeduren finden Sie im Kapitel 7. 


MaxonPASCAL 


106 


4.9.3 Verbundanweisung 

Man kann mehrere Anweisungen zu einer einzigen zusammenfassen, indem man sie mit „BEGIN“... 
,,END“ klammert: 

Verbundanwelsung = "BEGIN” Anweisung { [ ] Anweisung ) "END" 

Vor dem „END" muß also kein Semikolon stehen. Man darf es natürlich setzen, was iasofem in der 
Syntax enthalten ist, da man sich als letzte Anweisung eine Leeranweisung denkt. 

Verbundanweisungen werden bei den im folgenden beschriebenen strukturierten Anweisungen 
benötigt, da an einigen Stellen formal keine Anw'eisungsfolge, sondern eine einzelne Anweisung Ste¬ 
hen muß. 


4.9.4 Fallunterscheidung 

Die wicbdgste Art der Falluntersclieitlung ist die „IF“-Anweisung. Ihre Syntax ist wie folgt: 

"IF" Ausdruck "THEN“ Anweisung [ "ELSE" Anweisung ] 

Als Bedingung ist ein beliebiger Ausdruck des Typs „Boolean" erlaubt. Insbesondere kann hier eine 
einzelne Varialrle dieses Typs gesetzt werden. Ich weise darauf extra hin, da es ein „beliebtet' Stil- 
Fehler ist, 

IF b = true THEN ... 

ZU schreiben (wobei „b“ eine boolesche Variable ist). Hier reicht ganz einfach: 

IF b THEN_ 

Ist der Ausdruck „wahr", wird die Anweisung hinter dem „THEN“ au.sgeführt (mit Hilfe einer 
Verbundanweisung kann man hier natürlich auch eine beliebig lange Anweisungsfolge setzen). Ist 
die Bedingung nicht wahr, so wird ■ falls vorhanden - die Anweisung des „ELSE'‘-Tdls ausgefuhrt. 

Es gibt eine kleine „Zweideutigkeit“ in diesem Zusammenhang: 

IF bl THEN 

IF b2 THEN sl 
ELSE s2; 

Diese Zeile ist - syntaktisch betrachtet - nicht eindeutig: Das „ELSE" könnte theoretisch zu beiden 
„IF“ gehören. Man hat hier definiert, daß es zum letzten „IF" gehört. Die ohige Anweisung ent¬ 
spricht also 

IF bl THEN 
BEGIN 

IF b2 THEN Bl 
ELSE s2 


END; 



4. Syntax _ 

Um das „ELSE" ausdrücklich an das erste JP' zu bintlen, könnten Sie folgendes schreiben: 


107 


IF bl THEN 
BEGIN 

IF b2 THEN sl 
END 
ELSE 
s2; 

4.9.5 REPEAT-Schleife 

Syntax: 

"REPEAT" Anweisung { ";" Anweisung } “UNTIL" Ausdruck 

Der Schleifeninhalt wird ausgefühn, bis die Bedingung (beliebiger Boolean-Ausdruck) hinter dem 
„UNTIL“ wahr ist. Da die Bedingung am Schleifenende geprüft wird, wird die Schleife mindestens 
einmal durchlaufen. 

4.9.6 WHILE-Schleife 

Syntax: 

"VraiLE" Ausdruck "DO" Anweisung 

Die Schleife wird durchlaufen, solange die Bedingung erfüllt ist. . 

Unterschiede zu „REPEAT": 

• Die Bedingung (Boolean-Ausdruck) wird hier am Schleifenanfang geprüft. Dadurch wird die 
Schleife überhaupt nicht durchlaufen, wenn die Bedingung schon vor dem ersten Durchlauf 
„false“ ist. 

• Die Schleife bricht ab, sobald die Bedingung NICHT erfüllt ist (die REPEAT-Schleife wird durch¬ 
laufen, bis die,\bbruchbedingung erfüllt ist). 

• Der Schleifenkörper der WHIi.E-Schleife besteht formal nur aus einer einzigen Anweisung, ln 
Form einer Verbundanweisung (mit „BEGIN“ und „END“ eingeklammert) kann man aber auch 
hier eine beliebig lange Anweisungsfolge benutzen. 

4.9.7 FOR-Schleife 

Syntax: 

"FOR" Variable ":=" Startwert ("TO" I "DOWNTO") Endwert "DO" Anweisung 

Die Variable wird auf den Startwert gesetzt und dann nach jedem Schleifendurchlauf auf den 
nächsthöheren (bzw. nächsttieferen, falls „DOWfO“ verwendet wird) Wert gesetzt, bis der 
Endwert überschritten (bzw. unterschritten) wird. 



MilxonPASCAL 


108 


ALs Schleifcnzählvariable ist jede Variable eines geordneten Typs erlaubt, da.s sind: 

- Ganzzahltypen (NICHT Real!) 

- Char 
Boolean 

Aufzählungstypen 

- Ausschnittstypen aus diesen genannten Typen. 

Irn Gegensatz zu einigen anderen PASC.AL-Implementierungen mul:! die Variable nicht lokal sein. 

Start- und Endwert sind beliebig komplizierte Ausdrücke, die zur Zählvariablen zuweisungskompati¬ 
bel sein müssen. 

Bitte denken Sie daran, dali hinter dem „DO“ kein Semikolon stehen darf, es sei denn, Sie wollen 
ausdrücklich eine leere Schleife programmieren. 

Der Rumpf der FOR-Schleife ward keinmal ausgeführt, wenn der Stanweri größer (bei „TO“) bzw. 
kleiner (bei „DOWNTO“) als der Endw'ert ist. 

Innerhalb der Schleife darf der Wert der Schleifenvariablen nicht verändert werden. Dies wird vom 
Compiler aber nicht überprüft! MaxonPASCAl, berechnet vor dem ersten Schleifendurchlauf, wie oft 
die Schleife auszuführen und die Zählvariable weiterzuzählen ist. 

Die Schleife 

FOR v:= el TO e2 DO s; 


entspricht in etwa: 

v:a el; 

count:= ord(e2) - ord(v); 

WHILE count >= 0 DO 
BEGIN 

S/ { Schleifenrumpf ausführen > 

v:= succ (v); { Zählvariable weitersetzen } 

count:= count - 1 { internen Zähler erniedrigen } 

END; 

4.9.8 CASE-Anweisung 

Syntax: 

"CASE" Ausdruck ”OF" 

{ Konstantenliste ":" Anweisung ) 

[ ("OTHERWISE" I "ELSE") [ Anweisung { Anweisung } ] ] 

"END" 

Konstantenliste = Konstante [ Konstante ] { Konstante I 

Konstante ] } 



4. Svntax 


109 


Die CASE-Anweisung ist eine MeliitKli-Fallunlersclieidung, bei der aufgrund des Vergleichs eines 
geordneten Ausdrucks (also Ganzzahlig, Boolean, Char, Aufzählungstyp) mit Konstanten verzweigt 
wird. 

Wie Sie schon aus der Syntax erkennen können, gibt es hier zwei Ergänzungen zum ISO-Standard: 

• Es können Bereiche von Konstanten angegeben werden. 


Gase i Of 

-MaxInt..O, 20..MaxInt: 

writelnt'Eingabe nicht im erlaubten Bereich.'); 

1.. 8: writelnt'Zu kleinl'); 

12 .. 19:writelnt'Zu groß!'); 

9, 11: writelnt'Fast richtig. 

10: writelnt'Richtig.') 

End; 


' ) ; 


Dieses CASE-Statement gibt zu jeder Integerzahl „i“ einen Kommentar aus. 

Es gibt einen optionalen ELSE-Zweig, tler wahlweise mit .,ELSE“ oder „OTHERWISE“ eingeleitet 
wird. Dieser Teil kann beliebig viele .Anweisungen enthalten. 

Beispiel: 


Case c 

Of 


'A' , 

*a' : 

writelnt'Ah'); 

’B' , 

’b' : 

writelnt'Bee'); 

’C , 

' c' : 

writelnt'Zeh'); 

' D* , 

■d* : 

writelnt'Dee'); 

•O’ . 

. '9' : 

Begin 

writelnt ' Bitte )ceine Zahlen!'); 
writelnt' tich ]cann nämlich nicht zählen 
End; 

' e' . 

. ' Z ' ! 

writelnt'Irgend so'n Kleinbuchstabe.'); 

•E'..'Z': 

Else 

writeln; 

writelnt'Das war ein GROSSER Buchstabe.'); 


writelnt 

End; 


'Tut mir leid, diesen Buchstaben Icenne ich nicht.'); 


Wie bereits erwähnt, hätte man statt ELSE auch OTHERWISE schreiben können. Ferner sehen Sie, 
claR vor E1.SE (im Gegensatz zu IF-TlIEN-ElJsE) ruhig ein Semikolon stellen darf. 

Hat die CASE-Anweisung keinen ELSE-Zweig und der Ausdruck einen Wert, der in den 
Konstantenlisten nicht auftaucht, so wird ein Laufeeitfehler gemeldet. Es ist nicht erlaubt, einen 
Wert mehrfach in den Konstantenlisten aufzuführen. MaxonPASC.Al. meldet dabei aber keinen 
Fehler, .sondern führt, wenn der .Ausdruck einen doppelt vorgesehenen Wert hat, nur die erste 
.Anweisung aus! 




MaxonPASCAL 


110 


4 . 5.9 WITH-Anweisung 

Syntax: 

"WITH" Variable ( Variable ) "DO" Anweisung 

Die Variable muß von einem RECORD-Typ sein. Innerhalb der VtITH- Anweisung kann man dann 
jedes Feld dieses Records direkt wie eine Variable ansprechen. 

Beispiel: 

TYPE Person = RECORD 
Name: RECORD 

Vor, Nach: STRING [40] 

END; 

Piz; integer; 

Ort: STRING [50] 

END; 

VAR PI, P2: Person; 


WITH PI DO 
BEGIN 

Naine.Vor:= 'Dietrich'; 

Name.Nach:s 'Gerstenberger'; 
Plz:=. 4799; 

Ort:= 'Horchen' 

END; 


Die Anweisung ließe sich, da „Name" innerhalb der '»ITH-Anweisung ja eine eigenständige Variable 
ist, so weiter vereinfachen: 

WITH PI DO 

WITH Name DO 
BEGIN 

Vor:= 'Helmut'; 

Nach!= 'Kohl'; 

Plz!= 5300; I 

Ort:= 'Bonn' 

END; 

Dafür gibt es eine Abkürzupg: Man faßt einfach die beiden WITH’s zusammen: 

WITH PI, Name DO 
BEGIN ... 

END; 

Es ist aber nicht zwingend, daß die zweite Variable Bestandteil der ersten ist, es können auch von¬ 
einander unabhängige Variablen sein. 



Beispiel: 

WITH PI, P2.Name DO 
BEGIN 

Nach:= Name.Nach; 

P2.Plz:= Piz; 

P2.0rt:= Ort 
END; 

Was geschieht hier? Durch „WITH PI“ werden die Variablen „Name“, „Piz“ und „Ort“ eingerichtet, 
die sich auf Bestandteile von ,,P1“ beziehen, während „WITH P2.Name , die zu „P2 gehörigen 
Variablen „Vor“ und „Nach“ erzeugt. .Mso erhält in unserem Beispiel „P2" Nachname, Ort und 
Postleitzahl von „PI“. 

4.9.10 GOTO-Sprünge 

Syntax: 

"GOTO" Label 

Ein Inbel kann (siehe Kapitel 4.4 „Label“) entweder eine Ziffernfolge oder ein Bezeichner sein. 

Gemäß ISO-Standard kann man aus Strukturen mit „Goto“ herausspringen (z. B. aus Schleifen her¬ 
aus oder aus Unterprogrammen ins Hauptprogramm), aber nicht umgekehrt. 

MtixonPASCAl, macht sich aber nicht die Mühe, dies alles genau zu prüfen. So ist es z. B. möglich, in 
eine WHILE- oder REPEAT-Schleife hineinzuspringen. 

Lediglich Einsprünge in FOR-Schleifen und 'XITH-Anweisungen werden abgefangen (und natürlich 
der Sprung in ein Unterprogramm - schon allein dadurch, daß ein dort gesetztes Label ja lokal dekla¬ 
riert sein muß). 


Allgemein anerkannte Konvention über Goto: 


Sprünge sollten nur da eingesetzt werden, wo der normale Programmablauf abgebrochen 
wird (z. B. wegen eines Eingabefehlers) oder wo das Programm ohne GOTO unnötigerweise 
übermäßig aufgebläht würde. Man sollte aber bei jedem GOTO einen Kommentar setzen, aus 
dem hervorgeht, warum und wohin hier gesprungen wird und bei jedem Label vermerken, von 
wo und unter welchen Bedingungen hierher gesprungen wurde. 




5. Datenn'pen 


113 


5. Die Datentypen von MaxonPASCAL _ 

5.1 Numerische Typen 

M;)xonPASC.\L bietet nicht wcnij>er als 7 vcrsctiieciene ntimerische Datentypen: 

Integer 

Der gewohnte Ganzzahlbcreicli -(Maxim -f 1).H-Maxlnt, Mtixlnt=32767 

Longlnt bzw. Long 

32-Bit-Ganzzahltyp mit Vorzeichen, Bereich -(Maxlxinglni + l) bis -i-MaxIxtnglnt. Die Konstanten 
„MaxLonglnf und „MaxLong“ haben den Wert 2147483647. 

Shortint bzw. Short 

Vorzeichenbchafteter 8-Bit-l ntegertyp, MaxShonInt=M;ixShort=127. 

Cardinal bzw. Word 

Dieser Ganzzahltyp ist vorzeiclienlos, umfaJst also nur positive Werte und zwar im Bereich von (1 bis 
MaxCard = MaxWord=65535. 

ShortCard bzw. Byte 

Vorzeichenlose 8-Bit-Zahl, Wenehereich von 0 bis .MaxShortCard =MaxB\'te=255. 

Real 

32-Bit-Realzahlen: 24 Bit Mantisse, l Bit Vorzeichen, 7 Bit Exponent. Das reicht für ca. 7-stellige 
Rechengenauigkeit im Bereich bis etwas über 8*10'' 18. Nicht gerade viel, aber für die meisten 
Zwecke genug. 

LongReal bzw. Double 

Seit Version 2.0 gibt es jetzt auch FlicRpunktzahlen doppelter Genauigkeit nach lEEE-Norm. Sie 
sind 64 Bits breit (1 Bit Vorzeichen, 11 Bit Mantisse, 52 Bit+1 Hidden-Bit Mantisse), belegen im 
Speicher also 8 Bytes. Die Rechengenauigkeit ist etw'a 15-.slellig, der Exponentenbereich ist 1E+- 
308, das sollte genügen. 

5.1.1 Ganzzahl-Typen 

Fünf der genannten Zahlentypen, nämlich Integer, Shortint, Longlnt, Cardinal und ShortCard, sind 
sogenannte Ganzzahltypen, tl. h. sie umfas.sen nur ganz/aihlige Werte. .Alle diese Typen können 
beliebig durcheinander verwendet werden, ohne daß man Typwandlungen vornehmen muß. Der 
Haken: MaxonPASCAL muß trotzdem dafür sorgen, daß verschiedene zusammen benutzte 
Datentypen aneinander angepaßt werden. 

Diese Transformationen kosten teilweise nicht unerheblich viel Laufzeit, so daß es in der Regel bes¬ 
ser ist, in Ausdrücken nur Daten gleichen Typs zu benutzen. 



MaxonPASCAl, 


114 


MaxonPASCAL wählt bei Kombination von unterschiedlichen Datenrypen stets einen höheren, der 
beide umfaßt, z. B. w'ird die Summe eines Integer- und eines Cardinalwerts im I.onglnt-Bereich 
berechnet. 

Ausschnittstypen sind stets Integer- oder Longlnt-Typen, auch wenn sie theoretisch in einem „klei¬ 
neren“ Typ Platz hätten. Beispiel: 

Type 

Hundert = 1..100; {belegt 16 Bit, d.h. ist Ausschnitt von Integer} 
NochMehr = 0. .50000 { ist ein Longlnt-Typ, obwohl auch Cardinal 
möglich wäre. } 

Es können auch Hexzahlen (Beispiel: $686b, $00C00276, $0d, $Bad) und Binärzahlen (Beispiel: 
%110, %101010101, %00ir) verwendet werden. 

Bei allen Ganzzahltypen gibt es folgende arithmetische Operatoren: 

+ Addition 

Subtraktion oder auch Vorzeichen 
* Multiplikation 

DiV Ganzzahlanteii der Division 

MOD Divisionsrest 

Natürlich gilt „Punktrechnung vor Strichrechnung“, so daß Multiplikation und Division Vorrang vor 
Addition und Subtraktion haben. 

Gerechnet wird aber nur in den Wertebereichen Integer, Cardinal und Longlnt. Wenn zwei Shortlnt- 
t)der ShortCard-Werte verknüpft werden, werden sie automatisch nach Integer oder Cardinal 
gewandelt. 

Die beiden Divisionsoperatoren funktionieren nicht ganz korrekt, wenn einer der Operanden nega¬ 
tiv ist: In der Mathemadk ist es üblich, daß „a MOD b“ stets ein Ergebnis zwischen 0 und dem Betrag 
von b-1 liefert und daß bei „a DIV b“ immer das Ergebnis der normalen Division abgerundet wird. 

Die Divisionsbefehle des Mikroprozessors MCößOxO, der in Ihrem AMIGA steckt, arbeiten aber 
anders: Hier wird erst mit den Beträgen der Operanden gerechnet, und anschließend wird das 
Vorzeichen des Ergebnisses negativ gewählt, wenn genau einer der Operanden negativ war. Aus 
Geschwindigkeit.sgründen muß auch MaxonPASCAl. diese eigentlich falschen Operationen benut¬ 
zen. 



5. Datentypen 


115 


Die folgende Tabelle soll diesen Sachverhalt verdeutlichen: 

Mathematisch MC 680x0 


42 

DIVIO 

4 

(-42) 

DIVIO 

-5 

42 

DIV (-10) 

-5 

(-42) 

DIV (-10) 

4 

42 

MOD 10 

2 

(-42) 

MOD 10 

8 

42 

MOD (-10) 

8 

(-42) 

MOD (-10) 

2 


4 

-4 

-4 

4 

2 

-2 

-2 

2 


So tragisch, wie es zunächst scheint, ist das Ganze aber nicht, denn in der Praxis ist der linke 
Operand selten und der rechte fast nie negativ, AulSerdem ist sowohl bei der mathematisch übli¬ 
chen als auch der von Motorola (dem 680x0-Hersteller) vorgenommenen Definition gewährleistet, 
daß stets folgende Gleichung gilt: 


a = b*<a DIV b) + (a MOD b) 


Bei arithmetischen Operatoren kann es natürlich zu Überläufen kommen, wenn das Ergebnis einer 
Rechnung nicht im gewühlten Rechenbereich liegt. Es kommt nur dann zu einer Fehlermeldung, 
w'enn die entsprechende Compiler-Option mit „{$opt a-f}“, dem Pull-Down-Menü 
„Optionen/Compiler" oder dem „Preferences‘'-Tastaturmenü eingeschaltet wurde, andernfalls ist das 
Ergebnis Undefiniert. Genaueres Uber diese Option erfahren Sie im Kapitel 8, Abschnitt 1.5: 
„Compiler-Optionen". 

Im .Abschnitt „Typkonvertierungen" dieses Kapitels finden Sie Tips, wie Sie in bestimmten Fällen 
iJberläufe vermeiden können. 

Neben den erw'ähnten arithmeti.schen gibt es noch die logischen Operatoren AND, OR, XOR, NOT, 
SHL und SHR, die Zahlen bitweise verknüpfen: 

AND, OR und XOR funktionieren im Prinzip genau wie die gleichnamigen Boolean-Operatoren, nur 
daß hier jeweils die Bits der Operanden zu den entsprechenden Bits des Ergebnisses verknüpft wer¬ 
den. 


Hier sind einige Beispiele - mit Binärzathlen, da es hier ja auf die Bits ankommt: 


AND 

%11111100 
%10111010 

= 

%10111000 


%1100 

OR 

%10001010 


Ein Bit wird gesetzt, wenn 
beide Bits der Operanden 
gesetzt sind. 


Ein Bit wird gesetzt, wenn 
mindestens eins der Operandenbits 
gesetzt ist. 


%10001110 



MaxonPASCAL 


116 


%11001100 Ein Bit wird gesetzt, wenn die 
XOR %11111010 beiden Operandenbits verschieden 

-- sind, also genau eins gesetzt 

= %00110110 ist. 

NOT fühn auf ganzen Zahlen eine logLsdie Negation aus, d. h. alle Bits des folgenden Operanden 
wertlen invertiert. 

Beispiele: 

NOT 0 = -1 

NOT %110 = = -7 

NOT 26730 = -26731 

Genau wie bei booleschen Ausdrücken hat NOT auch hier höchste Priorität, so dalä 
NOT a*b äquivalent zu 

(NOT a) * b ist. 

Außerdem gibt es noch die Operatoren .SML und SHR, „Shift left“ und „Shift right“. Sie verschieben 
die Bits des linken Operanden um so viele Positionen nach links bzw. rechts, wie der zweite 
0[)erand angibt. Das entspricht einer Multiplikation mit bzw. einer Division durch eine 
Zweierpotenz. 

Beispiele: 

1 Shl 6 =64 (= 1 * 2''6) 

10 Shr 1 =5 (=10 div 2*1) 

MaxInt Shr 14 = 1 (= (2*15-1) div (2*14)) 

Beide Operanden müssen ganzzahlig sein. Der rechte Operand darf nicht negativ sein, andernfalls 
ist das Ergebnis Undefiniert (wenn es sich um eine negative Konstante handelt, z. B. „17 shl -2“, mel¬ 
det bereits der Compiler einen Fehler). Es findet kein Test auf Überlauf statt, auch nicht, wenn die 
Compiler-Option „Arithm. Überl. “ aktiv ist. 

Die Shift-Operanden zählen zu den Multiplikation.soperanden, sie haben also dieselbe Priorität wie 
„DIV“ oder „MOD“. 

Beispiel: 

NOT 1 shl 5 + 2 entspricht ((not l) shl 5) + 2 

Hier ist noch einmal eine Übersicht über alle Ganzzahl-Operatoren und ihre 
Auswcnungsreihenfolge. Es werden immer zuerst die Operatoren in den oberen und dann die in 
den unteren Zeilen der Tabelle zusammengefaßt. Operatoren, die in der selben Zeile stehen, wer¬ 
den von links nach rechts ausgew'ertet. 



5. Datentypen 


117 


Arithmetisch Logisch 


Invertierung; 

Multiplikativ: 

Vorzeichen: 

Additiv: 

Vergleiche: 


NOT 

*, DIV, MOD AND, SHL, SHR 

+, " 

+, - OR, XOR 

<, >, <=, >=, =, <> 


Bd der Ausgabe mil „WWe" werden Inieger-Zahlen linksbündig ausgegeben (Aliweichung vom 
Standard!). 

Write(17/ 4, 17+4); 


erzeugt also die Ausgabe 

17421 

Sie erhalten eine rechtsbündige Ausgabe, indem Sie hinter der Zahl die gewünschte Feldbreite als 
Ganzzahl-Ausdruck angeben: 

Writetl7:5, 4:5/ 17+4:10) 


gibt aus: 

17 4 21 

Bei der Eingabe mittels „Read" werden nur dezimale Zahlen akzeirtiert. Im Falle einer unerlaubten 
Eingabe wird aber kein laufeeitfehler gemeldet. 


5.1.2 Gleitpunktzahlen 

Ma.xonPASCAL benutzt die normalen Gleitpunkt-Bibliotheken, die das Betriebssystem zur Verfügung 
stellt. Insliesondere stehen zw'ei verschiedene Zahlenformate zur Verfügung: Die einfach genauen 
„Real“-Zahlen und ein doppelt genaues Format, das „LongReal“ oder „Double“ heißt. 

Eine Real-Zahl ist 32 Bit „breit“ und belegt also 4 Btles im Speicher, während Double 64 Bit=8 Byte 
breit ist. Rechnungen mit doppelter Genauigkeit sind erheblich langsamer als normale Real- 
Rechnungen, allerdings unterstützt die Mathebibliothek doppelter Genauigkeit eine evtl, vorhande¬ 
ne FPLI (Fließkomma-Coprozessor). 

Es ist erlaubt, in Ausdrücken beide Zahlenformate zu kombinieren oder auch Gleitpunktzahlen mit 
Gan/yahlau.sdrücken zu verknüpfen. Auch hier gilt, daß Typumwandlungen nicht unerheblich 
Reebenzeit benötigen. 



MaxonPASCAL 


118 


Auf beiden Zahlentypen gibt es folgende Operatoren: 

Multiplikation 
/ Division 

+ Addition 

Subtraktion oder Vorzeichen 


Natürlich gilt auch hier „Punkt- vor Strichrechnung". Ferner gibt es die üblichen Vergleichs- 
ojxirationen, die einen Boolean-Wert liefern: 

=, <>, <, >=, >, <= 

Ein Problem der meisten Programmiersprachen ist die „Überladung" von Operatoren: „+“ und 
sowie die Benutzung der Vergleichsoperatoren sowohl für Ganzzahl- als auch für 
Realoperationen. Dabei gelten folgende Regeln: 

• Wenn einer der beiden Operanden von einen Fließkommatyp ist, wird auch im 
Fließkommabereich gerechnet. 

• Bei einer Verknüpfung eines Real- und eines Double-Operanden wird das Ergebnis im Double- 
Bereich berechnet. 

Der Divisionsoperatorliefert stets eine Fließkommazahl als Ergebnis, bei „DIV" und „MOD" sind 
nur ganze Zahlen als Operanden erlaubt. 

Die beiden Fließkommatypen sind auch wertzuweisungskompatibel. Wenn man aber einen Real- 
Wert an eine Double-Variable zuweist, kann man Ülreraschungen erleben: 

Var r: Real; 
d: Double; 

Begin 

r:= 0.2; 
d:= r; 

writelntr, d) 

End. 

Ergebnis: 0.2 0.1999999880079071 

Die Double-Variable hat also scheinbar einen ungenauen Wen. Wie ist das möglich, da Double 
doch, Gerüchten zufolge, genauer ist als Real? Nun, eine Zahl wie 0.2 ist binär nicht mit endlich vie¬ 
len Stellen darstellbar (im Dezimalsystem kann man 1/3 ja auch nicht als endlichen Dezimalbruch 
darstellen). Wenn diese Zahl nun an die Real-Variable zugewiesen werden soll, erhält die Variable in 
Wirklichkeit den besten darstellbaren Näherungswert für 0.2 - und das ist in dezimaler Darstellung 
etwa 0.1999999880079071, Sie sehen hier die etwa 7stellige Genauigkeit. Wenn diese Realzalil nun 
ausgegeben wird, berücksichtigt die Ausgaberoutine des MaxonPASCAl.-Lauf 2 eitsystems die geringe 
Rcchengenauigkeit und rundet auf 6 oder 7 Dezimalstellen, je nach gewünschtem Ausgabeformat. 
Also wird 0.2 ausgegeben, und der Anwender wird mit diesem kleinen Trick über die geringe 
Rechengenauigkeit hinweggetäuscht. 



3. Datentypen 


119 


Durch „d:= r‘ bekommt aber die Double-Variable „d“ den ungenauen Näherungswen zugewiesen - 
und bei der nachfolgenden Ausgabe wird dann nicht auf 6, sondern auf 15 Dezimalstellen gerundet. 
So führt die höhere Genauigkeit zu einem scheinbar ungenaueren Ergebnis. 

Bei der Ausgate mittels „Wtite" gibt es mehrere Optionen: 

ra’ write(x) oder write(x:b) oder write(x:b:0) 

Im Bereich lOÜOO < x <= 0.1 wird die Zahl x „normal“ ausgegeben, andernfalls in 
Exponentialdarstellung. ln beiden Fällen werden überflüssige Nullen am Ende weggelassen. 

„b“ gibt hier wie immer die Breite des Feldes an, in das die Zahl rechtsbündig ausgegeben wer- 
tlen Süll. 

Bei negativen Zahlen beginnt die Ausgabe mit dem Minuszeichen, bei positiven Werten wird am 
Atifang ein Leerzeichen ausgegeben. Beispiele: 

write(-4/2) "2 

write(pi) 3.14159265358979 

write(26.7316+9:20) 2.6731E+10 

ins" write(x:b:n) mit n > 0 

Die Zahl x wird in Festkomtnadarstellung mit n Nachkommastellen ausgegeten. Beispiele: 

write(17.4:12:3) 17.400 

write(26.731: 12: 2) 26.73 

„rite(pi:25:25) 3.1415926535897930000000000 

Bei „Real“ sind bis zu 20 Stellen möglich. Beachten Sie aber, da(^ der AMIGA hier nur mit etwa 6 
1/2 - stelliger Genauigkeit rechnet, so daß es schon an der 7. Stelle (Vorkommastellen mitge¬ 
rechnet) zu Rundungstehlern kommen kann und der ganze Rest nur mit Nullen aufgefüllt wird. 
Im „Double“-Bereich sind bis zu 25 Nachkommastellen möglich, aber auch hier werden maximal 
16 „echte“ Stellen ausgegeben, der Rest ist Null. 

tä" write(x:b:n) mit n < 0 


Die Zahl x wird in FAponentialdarstellung und in „-n“ - stelliger Genauigkeit ausgegeben. 
Beispiele: 

write(26.731:12:-4) 2.673E+01 

write(0.07:12:-5) 7.0000E-02 

write(0:12: -3) O.OOE+00 

Die ganzen mathematischen Funktionen, wie „SIN", „liXF", „SQRT oder „LN", sind nur im Real- 
Bereich definiert. Sie können zwar wegen der beidseitigen Wertzuweisungskompatibilität auch auf 
Zahlen doppelter Genauigkeit angewandt werden, liefern dann aber ungenaue Ergebnisse, nämüch 
in der siebenstelligen Real-Genauigkeit! In der „mathieeedoubtrans.library“ finden Sie alle nötigen 
Funktionen in doppelter Rechetigenauigkeit. 



MaxonPASCAI, 


120 


5.2 Boolean 

Der Datentyp „Boolean“ umfafSt die beiden Werte „True“ und „False“. Sie sind geordnet; 

Es gilt 

False < True 
ordtFalse) = 0 
ord(True) = 1 

Eine Variable dieses Typs belegt ein Byte. Es gibt folgende Verknüpfungen: 

and logisches Und 

OR logisches Oder 

xoR logisches auschließliches Oder 

OR und XOR haben gleiche Priorität und zwar eine kleinere als .VND. 

Beispiel: 

a OR b AND c XOR d 

entspricht: 

a OR (b AND o) XOR d 

und damit (gleiche Priorität von OR und XOR, deshalb Auswertung von links nach rechts): 

ta OR (b AND c)) XOR d 

Außerdem gibt es noch die Negation NOT, die höchste Priorität hat: 

NOT a AND b entspricht deshalb: (NOT a) ÄND b. 

Umsteiger von BASIC (Was ist das? Nie gehön!) nach PASCAJ. wissen oft nicht, daß die Booleschen 
Verknüpftingen in P.ASCAL dieselbe Priorität wie arithmetische Operatoren haben, Somit wäre 

IP x>=0 AND x<10 THEN ... 

fttlsch: ,AN’D“ hat Vorrang vor den Vergleichoperatoren, so daß zuerst „0 AND x“ zusammengefaßt 
würde (in Standardpascal nicht erlaubt, bei MaxonPASÜ\L ist dies, falls x eine Ganzzahl-Variable ist, 
eine binäre Verknüpfung, die stets den Wert ü hat), und übrig biiebe der unsinnige und syntaktisch 
faische Mehrfachvergieich 

IF X >= (0 AND X) < 10 THEN ... 

Richtig wäre; 

IF (x>=0) AND (x<10) THEN ... 

Boolean-Werte können mit „Write“ au.sgegeben werden. 



5 . Datentypen 


121 


Beispiel: 

write(1=2) 

^ibt „false“ aus. 

5.3 Char 

Ein „Char“ isi ein einzelnes Zeichen („Character“). Es wird wahlweise mit einfachen oder doppelten 
.^•iführunj!;.szeichen eingeschlossen. 

Folgendes w'ären also korrekte Char-Konstanten: 

'A' "A” 'X' '2' . 


Das letzte Beispiel hätte man tiuch anders darstellen können: Ein Hochkomma wird in 
Hochkommata eingeschlossen, indem man es doppelt setzt, also ‘. Standard-PASCAL erlaubt es 
nicht, ein Char mit doppelten Hochkomma einzuschließen, so daß dort die letztere die einzige 
zulässige Darstellung ties Apostrophs wäre. 

MaxttnPASCAL verwendet natürlich den normalen H-Bit-Amiga-Zeichencode. Nicht-schreibbarc 
Zeichen sind die Codes von 0 bis 31 sowie von 128 bis 159. Dafür gibt es verschiedene Literalarten: 
Zum einen wäre da die gewöhnliche Schreibweise „Chr(n)", wobei „n“ ein ganzzahliger Ausdruck im 
Bereich von 0 bis 255 ist. Falls tier Parameter konsumt ist, kann die Chr-Funktion auch als Konstante 
verwendet w'erden, d. h. 

"CONST Linefeed = ehr(10)“ oder "CASE c OF ehr(13): ..." 

sind möglich. 

Ferner akzeptiert MaxonPASCAI. die von gewissen unter MS-DOS laufenden PASCAL-- 
Implementierungen her bekannte Schreibw'eise „#n“, wobei n eine ganzzahlige Konstante im zuläs¬ 
sigen Bereich ist. Und last not least kann man (da Charkonstanten äußerlich Ein-Zeichen-Strings 
sind) wie bei Stringkonstanten verfahren, z.B. ‘'\lü oder ‘‘SOa als Ersatz für chr(lO). Näheres dazu 
finden Sie im String-Kapitel. 

5.4 Aufzählungs- und Ausschnittstypen 

PASCAL bietet Ihnen die Möglichkeit, sich Datentypen selbst zu definieren. Eine einfache 
Möglichkeit sind die Aufzählungstypen. 

Man eizeugt diesen Datentyp ganz einfach, indem man die Werte, die jew'eils durch einen 
Bezeichner repräsentiert werden, als Liste in innden Klammern aufzählt. Ein beliebtes Beispiel: 


TYPE Wochentag = 


(Montag, Dienstag, Mittwoch, Donnerstag, 
Freitag, Samstag, Sonntag); 



MaxonPASCAL 


122 


Diese Zeile definiert niclit nur den neuen Datentypen „Wochentag“, sondern auch die sieben 
Konstanten „Montag“ bis „Sonntag". Deshalb dürfen diese Bezeichner zuvor noch nicht definiert 
sein. 


„Wochentag“ ist ein Datentyp, der die sieben diskreten Werte „Montag“ bis ..Sonntag" umfaßt. 
„Mittwoch“ z. B. ist eine Konstante mit dem Wert „Mittwoch“ - klingt seltsam, ist aber so. 

Welche Eigenschaften hat ein solcher Datentyp, und was kann man damit machen? Die Elemente 
sind geordnet; Es gilt Montag < Dienstag < Mittwoch < ... < Sonntag. Des weiteren haben sie 
auch Ordnungszahlen: Ord(Montag)=ü, Ord(Dienstag) = 1 usw. Auch die Funktionen „Succ“ und 
„Fred“ können auf Aufeahlungstypen angewendet werden, z. B. Succ{Montag)=Dienstag, 
Pred(Ereitag)=Donnerstag. Das sind dann aber auch so ziemlich alle Operationen auf 
Aufzählungstyixtn. Ihr Sinn ist im wesentlichen, Programme übersichtlicher zu gestalten, z. B. indem 
man Wochentage nicht durchnumeriert, sondern wie im obigen Beispiel über ihre Namen verwaltet. 
Eine Variable eines Aufeählungstyps belegt übrigens immer 2 Bytes. 

Die andere Klasse von einfachen selbstdefinierten Datentypen sind die Ausschnittstypen. Dazu 
nimmt man sich einen bereits existierenden geordneten Datentypen, also einen Ganzzahltypen, 
Boolean, Char oder einen Aulzahlungstypen und .schränkt seinen Wertebereich auf ein beliebiges 
Interval ein. Das folgende Programmfragment enthält einige Ausschnittstypen: 


TYPE 

Positiv 

Wochentag 

Arbeitstag 

Gross 

Ziffern 


l..Maxlnt; { Dies Ist ein Ausschnitt aus Integer, 

der alle positiven Integerzahlen umfaßt } 
(Montag, Dienstag, Mittwoch, Donnerstag, Freitag, 
Samstag, Sonntag); { kennen wir schon } 

Montag..Freitag; { ein Ausschnitt aus dem Typen 
"Wochentag" ) 

'A' .. 'Z'; { 26-elementiger Aussohnittstyp von 
"Char" ) 

■0' .. '9'; ( auch dies ist ein Char-Ausschnitt ) 


VAR 


n: Positiv; { die Variable "n" kann nur positive Werte 

haben } 

1: 0 .. 2673142; { ein Ausschnitt aus "Longint" } 

PlusHlnusCard;-MaxCard .. +HaxCard; { auch dies ist ein 


Seltsam; 

Heute: 
IstLelder: 

HätteGern: 


Ausschnitt aus "Longint" } 

False . . True; { lunständliche Art, eine Boolean- 
Varlable zu deklarieren } 

Wochentag; 

Montag..Freitag; { ist im Vergleich zu "Heute" 
auf 5 Werte beschränkt ) 

Samstag..Sonntag; ( Achtung: beliebter Fehler ist, 
hier "(Samstag,Sonntag)" zu 
schreiben. Überlegen Sie doch 
• mal, warum das nicht gehtl } 


5. Datentypen 


123 


Man definiert Ausschnittstypen also, indem man eine Unter- und eine Obergrenze angibt. Beide 
Grenzen müssen Konstanten sein; die untere muß kleiner als die obere sein, denn sonst meldet der 
Compiler einen Fehler. 

Eine Variable eines Ausschnittstyps verhält sich exakt wie eine des Grundtyps. Einziger Unterschied: 
Bei jeder Wertzuweisung wird geprüft, ob die Variable im erlaubten Bereich liegt; andernfalls bricht 
das Programm mit einer Fehlermeldung ab. 

5.5 Stringtypen 

Ein String ist eine beliebig lange Folge von Zeichen. Rs gibt zwei verschiedene Stringtypen: 

• Die Deklaration ,.String|n]“ ist identisch mit ,Array |l..n] of Char". Das Symbol „String“ ohne 
hängenangabe entspricht „String[80]“. Zwar ist „String" kein Typbezeichner, sondern eine sog. 
Directive. Seit Version 1.5 von KICK-P.ASCAL kann „String" aber überall als Pseudo- 
Typbezeichner verwendet werden, z. B. auch als Typ in Parameterlisten. 

• Der Datentyp „Str“ ist ein Zeiger auf einen String. 

Beim ersten Typ müssen Sie eine maximale Lange festlegen. Hier können Sie über den Index auch 
jedes Zeichen einzeln ansprechen. Das Ende wird mit einem Zeichen chr(0) markiert. Weil auch die¬ 
ses Zeichen ein Byte benötigt, können Sie in einem „StringjSj“ effektiv höchstens 4 Zz^ichen unter¬ 
bringen. 

..Str“ ist nichts weiter als ein Pointer. Das ;\M1GA-Betriebssystem benötigt häufig solche Zeiger auf 
Texte, und das ist auch der einzige Grund, warum dieser Typ in MaxonPASCAL implementiert wur¬ 
de. 

Er Lst nämlich eine etwas haarige Angelegenheit. Betrachten Sie bitte einmal folgendes Programm: 

Program strings; 

Var sl:8tr; s2:String[10]; 

Begln 

s2:='Hallo'; 
s1:=b2; 

s2:='Horrido'; 
writeln(sl) 

End. 

Raten Sie mal, welche Ausgabe dieses Programm macht: Zuerst wird in „s2“ der Text 'Hallo' abgelegt 
(s2[ 11 = ’H',..., s2[5] =’o’, .s2[6] =chr(0)). In der nächsten Zeile wird „s2“ an „sl“ zugewiesen. 

„sl" besitzt aber keinen eigenen Speicher außer den 4 Bytes, die ein Pointer lienötigt („s2“ belegt 10 
Bytes). Vielmehr zeigt der ZEIGER „sl“ nach dieser Zeile auf die Variable „s2". Wenn dann in der 
nächsten Zeile ein anderer Text an „s2“ zugewiesen wird, ändert sich auch der „Inhalt“ von „sl“. 
Ergn gibt das Programm ‘Horrido’ aus - ein eklatanter Verstoß gegen die Prinzipien gepflegter PAS- 
C.Al.-Programmierung. 



MaxonPASCAL 


124 


An diesem Beispiel sehen Sie auch, daß Sie den Wert, auf den „sl“ zeigt, erhalten, ohne (wie bei 
normalen Pointern notwendig) „slzu schreiben. Das liegt daran, daß .MaxonRASC.AI. Strings 
intern ohnehin nur über ihre Speicheradresse verwaltet werden. 

Gefährlich wird es (und auch das dürfte es in PASQU, eigentlich nicht gelx'ii), wenn im obigen 
Beispiel „s2“ lokal in einer Procedure und „sl“ als globale Variable tieklariert w'äre. In tler Prozedur 
wird „sl“ zunächst ein Zeiger aut die lokale Variable „s2“ zugewie.sen. Wenn das Programm dann die 
Prozedur verläßt, existiert die Variable „s2“ garnidit mehr, untl „sl“ zeigt deshalb irgentlw'o in die 
Wallachei. Sobald der entsprechende Sjteicherbereich wieder benutzt wiixl, wird der Wert von „sl“ 
geändert. 

Dieser Exkurs zeigt, daß Sie den Str-Typ hauptsächlich im Zusammenhang mit der .AMIGA- 
Betriebssystemprogratnmierung versvenden sollten. Er ist auch ohnehin nicht so interessant, weil 
man eine solche Variable weder über Reatl/ReadLn einiesen noch die Zeichen einzeln ansprechen 
kann. Alles, was Sie mit „str“ anfangen können, ist: 

• eitle Variable zuweisen. 

• eine Stringkonstante zuweisen, z.B. “sl: = 'Ilalleluja’'‘. Eine solche Ziweisung kann bedenken¬ 
los auch in einer Prozedtir niedrigeren Ranges erfolgen, denn die Konstante liegt nicht im 
Variablenspeicher, sondern im Progratnmeode. 

• mit anderen Strings vergleichen. 

• mit Write(ln) ausgeben. 

• als Parameter in Funktionsaufrufen verwenden. 

Damit wären wir auch schoti heim nächsten ThemaiOperationen auf Strings. 

MaxonPASCAL hat folgendes auf latger: 

• Wertzuw'Ci.sungen - wie oben gesehen. 

• Au.sgahe tnit Write./'X'riteLn. 

• Eingabe mit Read./ReadLn (geht nicht mit Str). 

• Vergleichsoperationen =, <>, <, < = , >, >=. Es kann auch ein String mit einem Char 
verglichen werden. 

• Verbinden mit „+" oder l\ct„C otical" - Funktion - Mit„t.b/iv“ auf Au.sschnitte zugreifen. 

Stringkonstanten können wahlweise mit ‘' (wie in Standard-FASCAL) oder mit “ “ eingeschlosscn 
werden. Es gibt die Möglichkeit, Steuerzeichen in Strings einzusetzen: Man unterbricht den String 
mit' oder „ - aber mit dem selben Zeichen, mit dem man ihn begonnen hat - untl kann dann entwe¬ 
der mit $xx eine Hexadezimalzalü oder mit \ eine Dezimalzahl einschieben. 

Beispiel: 

Program Steuercodes; 

Begin 

writelnt'xxx aaa'$0d'bbb'); 

{ $0d oder dezimal 13 entspricht dem Code "CR“ ("Wagenrücklauf"). 

Der Cursor springt an dieser Stelle an den Zeilenanfang, so daß 
"XXX" von "bbb" überschrieben wird. } 



5. Datentypen 


125 


writeln("Zeile 1"\10$a"Zelle 2"); 

{ Dezimal 10 = Hex $a entspricht "LF" ("I,inefeed"/"Zeilenvor- 
Bchub"). Hier werden zwei Zeilenenden eingesohoben. ) 

writelnC’ '$9b'33mJetzt '\155’32;4mwird' •s'\155'31;0;3m bunt 1'$0a); 

{ Der Steuercode dez 155 bzw. Hex $9b heiSt "Escape" oder "CSI" 
("Control Sequence Introducer" - "Steuersequenzeinleiter"). Damit 
haben Sie enorm viele Möglichkeiten, die ich hier nicht einzeln 
aufzählen kann. Setzt man z. B. dahinter eine oder mehrere 
Dezimalzahlen (ggf. durch ";" getrennt) und beschließt die Sequenz 
mit einem kleinen "m", wird das Aussehen des Textes beeinflußt: die 
Zahlen 0..7 stellen verschiedene Textattribute ein (unterstrichen, 
kursiv, ...) und Zahlen 30..37 setzen die Schriftfarbe. 

Außerdem fällt auf, daß 

a) der String mit einem Steuercode beginnt, indem der Leerstring '' 
vorangestellt wird, 

b) ein Apostroph ' im String enthalten ist, indem er doppelt 
gesetzt wird und 

c) die Zeichenkette mit einem Steuerzeichen endet, ohne daß 
dahinter noch ein Hochkomma stehen muß. } 

writeln('Zelle 4'\n'Zeile'\e'33;Om 5'); 

{ Hinter können Sie auch die Buchstaben "n" und "e" setzen. 

Ersterer entspricht dem Zeichen LF (Code $0a), letzterer "CSI" 

(Code $9b). ) 

End. 

Prohlcmatiscli wird es, wenn auf oben beschriebene Weise ein Nullbyie in einen String eingesetzt 
wird. Sowohl MaxonP.VSCAI. als auch das MllGA-Betricbssystem betrachten dies in der Regel als 
Stringendemarkierung, so daR der Rest eventuell verloren geht. Wenn Sie einmal eine solche Null 
benötigen - z.B. bei der Intuition-Funktion JVspkiyAleti“ - müssen Sie den String äußerst vorsichtig 
behandeln. 

Wenn ein String mit einem Steuerzeichen beginnen soll, können Sie am Anfang statt des Iiterstrings 
auch das Zeichen verwenden. Außerdem kann „#“ iilaerall als Ersatz für den Backslash „\“ ver¬ 
wendet werden. Eine Zeile aus dem obigen Beispiel könnte also auch so aussehen: 

write(#$9b'33mJetzt ’#155•32;4mwird■'s■#155'31;0;3m buntt'$0a); 

Durch solche Steuercodes kann ein String ganz schön lang werden. Er darf aber normalerweise das 
Zeilenende nicht überschreiten. Zu diesem Zweck gibt es die Möglichkeit, die beiden Zeichen 
in den String einzuschieben. Dahinter können dann beliebig viele Zeilenenden, heer/eichen oder 
sogar Kommentare stehen, bevor der String fortgesetzt wird. 


writet'Ein Gedicht \n\n\e ' 32mvon Douglas Adams '\ii\n\& 
\x'[33mO zerfrettelter Grunzwanzling1'\n\& 

'Dein Harngedränge ist für mich'\n\& 




MaxonPASCAL 


126 


'Wie Schnatterfleck auf Bienenstich. '\St 
\n\n\c ■31mDen Rest erspare ich Ihnen.*) 

Dieser Befehl gibt einen mehrere Zeilen langen Text auf einen Schlag aus. Allerdings ist in 
MaxonPASCAL die linge von String-Konstanten auf 400 Zeichen beschränkt - um einen Roman aus¬ 
zugeben, werden Sie also doch mehr als eine Zeichenkette benötigen. 

Im obigen Beispiel tauchen außerdem die Einschübe „\c“ und „\x“ auf. 

„\x" ents[iricht dem Escape-Zeichen #f Ib. Zusammen mit einer folgenden eckigen Klammer ist 
es äquivalent zum CSI-Zeichen. Diese Folge hat aber den Vorteil, daß sie auch vom Druckertreiber 
verstanden wird. Man kann \x’[‘ mit \c abkürzen. 

Es gibt noch zwei wichtige Funktionen zur Stringbehandlung; „Concat“ und „Copy“; 

Concat(Btringl, strlng2, ...) 

hängt die übergebenen Strings zusammen. Das Ergebnis wird als „temporärer String“ zurückgege¬ 
ben. 

„'Ä'as ist das?“ Die Variablen eines „String[N]“-Typs besitzen jeweils einen für sie reservierten (N 
Brtes langen) Speicherbereich. Auch eine Stringkonstante liegt an einer bestitiimten Stelle im 
Speicher, und ein „Str“-Zeiger zeigt wenigstens auf eine Speicheradresse. Das Ergebnis, das 
„Concat“ zurückgibt, hat aber keinen vorher bestimmten Speicherplatz, vielmehr wird unmittelbar 
vor dem Zusammenhängen irgendwo die benötigte Menge Speicher reserviert (denn das Ergebnis 
kann ja beliebig lang werden) und muß nachher wieder freigegeben werden. Der String ist also 
quasi nach dem Lesen zu vernichten. 

(Wüßten Sie schon: Dokumente der höchsten NATO-Geheimhaltungsstufe tragen den Stempel 
„DBR“ - „Destroy Before Reading“....) Von der internen Verwaltung dieser Strings merken Sie als 
PASCAL-Progiammierer in der Regel nichts, denn wenn Sie einen „Concatinierten" String mit Write 
ausgeben oder an eine Stringvariable zuweisen, managed das PASCAL-Lauf/.eitsystem das Ganze für 
Sie. 

Eine Einschränkung gibt es aber: Ein temporärer String kann nicht an eine „Strt-Variable zugewiesen 
werden. Grund: Ein temporärer String ist ja nur „von begrenzter Lebensdauer“, und eine Str- 
Variable hat ja auch keinen Speicher, in dem sie den String aufbewahren könnte, sondern bnn 
lediglich auf eine Zeichenfolge zeigen. Und ein Zeiger auf einen String, der sich bald in Wohlgefallen 
auflöst, wäre ja wenig sinnvoll. 

Deshalb ist es natürlich auch nicht erlaubt, solche Strings als Parameter an Prozeduren und 
Funktionen zu übergeben, die einen „Str“-Parameter erwarten. Dazu gehören z. B. die PASCAL- 
Standardprozedur ,Assign(datei, namestr)", die Funktion „Pos(strl, str2)“ und jede Menge AMIGA- 
Systemfunktionen. Sie müssen hier also bei Bedarf das „Concat“-Ergebnis zunächst an eüie 
Stringvariable zuweisen. Übrigens; Sie können Strings ersatzweise auch mit „+“ aneinanderhängen. 



5. Datentypen 


127 


Beispiel: 

s ;= IHallo' + 'Du'+Concat(Concat {'AlterEimer'Wie) + 'Geht's', '?') 

Danach liat s den Wert „HalloDuAlterEinierWieGeht's?“ 

Copytstring, poe, len) 

Diese Funktion liefen einen „len“ Zeichen langen Ausschnitt ab Position „pos“ aus der Zeichenkette 
„String“. Auch hier ist das Ergebnis ein temporärer String, es gilt also sinngemäß dasselbe wie bei 
der Krtnkaiination (lachen Sie nicht, dieses Won gibt s wirklich). 


writetCopyt'PASCAL the best - - the restl',8,3)) 

gibt „the“ aus. 

Wahrscheinlich war die erste Programmiersprache, die Sie gelernt haben, BASIC, so daß Sie es wahr¬ 
scheinlich gewohnt sind, mit „mid$(a$,17,l)“ auf das 17te Zeichen von „a$“ zuzugreifen. Trotzdem 
sollten Sie (so schwer das auch oft fällt) mit dieser schlechten Gewohnheit brechen und stets a[171 
statt Copy(a,17,l)) schreiben (Vorausgesetzt, a ist eine Variable eines String[x]-Typs). Dafür gibt es 
gleich vier gute Gründe: 

1. Ersteres ist kürzer. 

2. Es geht deutlich schneller. 

3. Außerdem ist es Standard-PASCAL-kompatihel. 

4. „Copy“ gibt stets einen String zurück, so daß Sie das Ergebnis nicht an eine Char-Variable zuwei¬ 
sen können, auch w'enn es nur ein Zeichen lang ist. 

Bei einem Stringausdruck, einer Zeichenkettenkonstanten oder einer „Str“-Variablen ist es nicht 
möglich, wie oben beschrieben, auf ein einzelnes Zeichen zuzugreifen. Dafür gibt es - als besonde¬ 
res MaxonPASCAL-Feature ab Version 1.5 - eine andere Schreibweise: hinter jeden Zeichenketten¬ 
ausdruck kann ein Punkt, gefolgt von einem Pseudo-Index, gesetzt werden. 

Ein Beispiel: 

Program streawkceuR; Var Vorname, Nachname: String; 

i: integer; 

Begin 

writet'Vorname: '); readln(Vorname); 

write('Nachname: '); readln(Nachname); 

For i: = 12 Dovmto 1 Do 

writet'Ihr Name ist'.[i]); 
writelnt':') 

For i:=Length(Vorname)-fLength(Nachname)-fl Downto 1 Do 
write ( (Vorname+' '-fNachneime) . [i] ) 


End. 



MaxonPASCAI 


128 


Dieses Progrämnichen fragt den User nach seinem Namen und gibt dann erst den Text „Ihr Name 
ist" und dann den vollständigen Namen rückwärts aus, indem es die beiden Stringausdrücke zei¬ 
chenweise von hinten nach vorn schreibt. 

Was wäre in jenem Programm der Unterschied zwischen „VornamejS]“ und „Vnrname.|5]"? Ersteres 
ist eine Char-Variable, nämlich das fünfte Element des Char-Arrays „Vorname“. Dieser Variablen 
kann man z. B. auch einen Wert zuweisen. Das zweite ist ein Char-Ausdruck. so wie „Chr(k+8)“ 
oder „Succ(A) , und kann deshalb nicht auf der linken Seite einer Wertzuweisung auftreten. 
„Stringausdruck. [Index]“ ist also identisch mit „CopyfStringausdnick,Index,1)", nur daß ersteres ein 
Char und letzteres einen String liefert. 

5.6 Pointertypen 

Außer den normalen Pointern besitzt MaxonPASCAI noch einen typfreien Pointertypen namens 
„ptr". Eine Variable dieses Typs kann auf einen beliebigen Typ zeigen - weshalb es auch nicht mög¬ 
lich ist, mit „ “ diese Variable anzusprechen. Natürlich kann auf einen solchen Zeiger auch nicht 
New oder Dispose angewandt werden, denn es ist ja gar nicht klar, wie viel Speicher dabei reserviert 
bzw. freigegelten werden muß. 

Wahrscheinlich werden Sie sich jetzt fragen, welchen Sinn dann ein solcher Zeiger hat. Nun, im 
Gegensatz zu normalen Zeigern kann an eine Ptr-Variable ein beliebiger Pointertyp zugewiesen w^er- 
den und umgekehrt. Ein Beispiel: 

Program Pointer; 

Var pl:*Typl; p2:»Typ2; p:ptr; 

Begin 

... P!=pl; p2:=p; ... 

Das Ergebnis dieser Zuweisungen: p2 zeigt auf dieselbe Variable wie pl, obwohl diese eigentlich ver¬ 
schiedene Typen haben (im nächsten Abschnitt werden Sie erfahren, wie so etwas auch einfacher 
geht). 

Jetzt werden Sie wahrscheinlich denken: OK, aber welchen Sinn hat SO ETWAS denn nun wieder? 
Darauf sei ebenso kurz wie ausweichend geantw'ortet, daß Sie das zur System-Programmieamg 
benötigen, worauf in einem der nächsten Kapitel noch eingegangen wird. 

A'/iW und DISPOSE verwenden übrigens nicht den reservierten .Arbeitsspeicher, sondern die Exec- 
Funktionen „Alhcmem“ und „Freemem", falls Ihnen das etwas sagt (falls nicht: erstere fordert: 
„Bitte ein Kilo Byte!“ vom Betriebssystem Speicher an, letztere gibt ihn wieder zurück). Somit 
schränken dynamische Variablen nicht Ihren Stack-Speicher ein. Es wird aber bei „New“ quasi Buch 
geführt, w'elche Speicherbereiche reserviert wurden. Dadurch kann es zum einen bei „Dispose“ 
nicht zu einem Absturz kommen (Guru Meditation Number $81000009), und zum anderen ward der 
Speicher am Programmende wieder ordentlich freigegeben 

UntI noch eine Besonderheit hat MaxonPASCAI. im Zusammenhang mit Pointern auf Lager: Wenn 
Sie einer beliebigen Variablen ein „ ^ “ voransiellen, erhalten Sie einen Zeiger auf diese Variable. 



5. Datentypen 


129 


Beispiel: 

Program Pointer2; 

Var i:integer; p: ■'integer; 

Begin 

i:=26731; p:=^i; writeln(p*) 

End. 

Ein anderes Beispiel: „MyScreen“ sei der Zeiger, den Ihnen die Intuition-Funktion „OpenScrem“ 
(Typ: Screen) zuriickgegeben hat. 

Mit der Prozedur „C/eflr&ree«“ aus der Graphics-lihrary wollen Sie nun diesen Bildschirm löschen. 
Dazu brauchen Sie einen Zeiger auf den sog. Kastport des Screens, der als Feld (also nicht in Form 
eines Pointers!) in der Screenstruktur {Struktur= Record) enthalten ist. Der Befehl sieht so aus: 

ClearScreen(^MyScreen*.Rastport); 

Die Schreibweise mit den zw'ei „ ^ “ ist zugegebenermaßen etwas ungewohnt. Hier sehen Sie auch, 
daß die Auswertung quasi von rechts nach links erfolgt: Das erste „ ^ “ bezieht sich auf den ganzen 
Austlruck „MyScreen .Rastport" und nicht nur auf „MyScreen“ (zumal ein Zeiger auf einen Zeiger 
keine allzu nützliche Sache ist). 

Natürlich sollten Sie sich hüten, einen Pointer zu DISPOSFn, den Sie mit „ “ auf eine NICHT durch 
New erzeugte Variable gesetzt haben. Die Folge wäre aber nur eine Fehlermeldung, denn 
MaxonPASC,AL paßt hier auf. 


5.7 SET-Typen 

Sets können ziemlich grt)ß werden: der Riemcntbereich darf bis zu 2 16 - 16 = 65520 Werte 

umfassen, wobei stets die untere Grenze zur nächsten durch 16 teibaren Zahl abgerundet und die 
obere zur nächsten höheren (!) durch 16 teilharen Zahl aufgerundet wird. So ist z. B. 

VAR s: SET of 0..65519; 


eine der größtmöglichen Mengen im Ixtnglnt-Bcreich. „1..65520“ geht nicht, denn lüer wmd die 1 
auf 0 ab- und die 65520 auf 65536 aufgerundet. Im Integerbereich wäre entsprechend 

VAR t:set of -32752..32767; 


geratle noch möglich - also fast schon „Set of integer"! 

Elementtypen können alle geordneten Datentypen sein, also Char, Boolean, Ganzzahl- und 
Aufzählungstypen sow'ie Ausschnitte daraus. 


Insgesamt gibt es folgende Verknüpfungen auf Mengen: 


* Schnittmenge: 

+ Vereinigung: 

Differenz: 

= Mengenvergleich: 

<> Gegenteil von = 


[1..8]*[5..10] = [5..8] 

[1,2] -I- [2,6..10] = [1,2,6..10] 
[-10..10]- [-Maxint.O] = [1..10] 
[17,4,21] = [4,17,21] istTRUE. 



MaxonPASCAL 


130 


<= Teilmenge: 

>= genau andersrum: 

IN „Ist Element von“: 


[1,7]<=[0..10] 
[0..10]>= [1.7] 
5 IN [1..10] 


Ist TRUE. 
Ist TRUE. 
Ist TRUE. 


Auch hier gelten die normalen „Punkt- vor Strichrechnung“-Regeln: 
X IN a-b*c entspricht x in (a-(b*c)) 


Sie sollten aber immer bedenken, daß Mengenoperationen in MaxonPASCAL (wie in wohl fast allen 
anderen PASCAL-Implementierungen) nicht gerade schnell sind. Genaugenommen sind sie sogar 
total lahm, vor allem dann, wenn die beteiligten Mengen groß w'erden. Deshalb sollten Mengen sol¬ 
chen Verwendung.szwecken Vorbehalten bleiben, bei denen es nicht auf Geschwindigkeit ankommt. 


Eine Ausnahme gibt es aber: Falls hinter „IN" eine Mengenaufeählung steht, die ausschließlich aus 
Konstanten besteht, wird dies von Ma.xonPASCAL zu einer Folge von Vergleichsoperationen opti¬ 
miert. So ist z. B. 


L in [0,10..20,100..120] 


erheblich schneller als 

(L=0) or (L>=10)and<L<=20) or (L>.100)and(L<=120). 


5.8 Strukturierte Datentypen: Arrays und Records 

Strukturierte Variablen sind allgemein Zusammenfassungen mehrerer Variablen zu einer größeren 
Einheit. Es gibt in PASCAL zwei Arten von solchen Variablen: Feldtypen (,Arrays“) und 
Verbundtypen („Records“). 

Betrachten wir zuerst die Felder. Ein Feldtyp wird definiert durch 

"ARRAY" "[" Indextyp "]" "OF" Elementtyp 

Der Indextyp kann ein beliebiger geordneter Datentyp sein, also ein Ganzzahltyp, Char, Boolean, ^jl 
ein Aufzählungstyp oder ein Ausschnitt aus einem dieser Typen. In der Regel benutzt man hier aber 
Ausschnittstypen. Der Elementtyp kann ein beliebiger Datentyp sein. 

Es wird jedem Wert des Indextyps eine Variable des Elementtyps zugeordnet. 

Ein Beispiel: 

VAR Feld: AHRAY[1..10] OF F Char; 

Die Variable „Feld“ besteht aus den zehn Elementen „Feldjl]“ bis „Feld] 10]“, die jeweils Char- 
Variablen sind. Das Ganze ist übrigens idenüsch mit dem Datentypen „String] 10]“ (siehe Abschnitt 5 
dieses Kapitels). 


5. Datentypen 


131 


Alternativ hätte man auch so deklarieren können: 

TYPE Feldlndex = 1..10; 

FeldTyp = ARRAY[Feldlndex] OF Char; 
VAR Feld: FeldTyp; 


Der Elementtyp kann ein beliebiger Datentyp sein - also auch ein weiterer Array-Typ, z. B, 



TYPE DreiD = ARRAY[-l..l] OF 

ARRAY [ • a • . . ' z ' ] OF 
ARRAY[Boolean] OF 
Integer; 

Das kann abgekürzt werden durch: 

TYPE DreiD = ARRAY[-l..l, Boolean] OF integer; 


Entsprechend kann man, wenn ,Arr“ eine Vaiiable des Typs „DreiD“ ist, ein Element wahlweise mit 

Arr[ i+1 ] [ ’x' 1 [ i=j ] 


oder 

Arr[ i+1, 'X', i=j ] 


ansprechen. 

Die Syntax für „Array-Typ“ ist also: 

"ARRAY" "[" GeordneterTyp { GeordneterTyp } ”]” "OF"s Typ 


Die Anwendungsmöglichkeiten von Arrays sind so vielfältig, daB jeder, der überhaupt schon einmal 
in irgendeiner Sprache programmiert hat, auf Anhieb zahlreiche Beispiele dafür aus dem Schatz sei¬ 
ner Erfahrungen nennen kann. Deshalb will ich Sie hier nicht mit einem Beispielprogramm dafüi 
langweilen, sondern gleich zum zweiten strukturierten Datentyp übergehen: dem Record. 


Ein Record- oder Verbundtyp falät mehrere Variablen beliebigen, auch unterschiedlichen, Typs zu 
einer Verbundvariablen zusammen. Ein klassisches Beispiel aus der Mathematik: eine komplexe 
Zahl besteht aus einem Realteil und einem Imaginärteil, die jeweils reelle Zahlen sind, ln PASCAI 
sähe das so aus: 


TYPE Komplex = RECORD 

Re: Real; 
Im: Real 
BND; 


Das kann abgekürzt werden zu: 


TYPE Komplex = RECORD 

Re« Im: Real 
END; 



MaxonPASCAL 


132 


Eine Variable .pc“ des Typs „Komplex" besteht dann aus zwei „Feldern“, die „x.Re" und ,x.lm“ heißen 
und jeweils Real-Variablen sind. 

Ein anderes Beispiel: Von lOÜOO Studetiten sollen Vorname, Naehname (jeweils Strings mit bis zu 40 
Zeichen) und .Matrikelnummer (Longlnt)) gespeichert werden. 

Dies läßt sich realisieren, indem man drei Arrays deklariert: Zwei Stringarrays für die Vor- bzw. 
Nachnamen und ein ,„ARRAY OF Long“ für die Matrikelnummern. Aber sinngemäß gehören ja nicht 
alle Vornamen zusammen, sondern jeweils der Vorname, der Nachname und die Nummer jedes ein¬ 
zelnen Studenten. Lm die.se Zusammengehörigkeit im Programm klarzumachen, bietet sich die 
Verw-entlung von Records an: 

VAR Studies = ARRAY [1..10000] OF RECORD 

Vorname, Nachname: String[40]; 
Matrlkelnmnmer: Long 
END; 

Eine Zuweisung an den k-ten Studenten könnte dann so ausseheii: 

Studies tlt]-Vorname: = 'Willi'; 

Studies[k]-Nachname:= 'Wacker'; 

Studiestk] -Matrikelnuimner:= 3710815; 


Einige Angaben zur Syntax: 

Record-Typ: "RECORD" Feldliste "END" 

Feldliste: { Bezeichner { Bezeichner ) ":" Typ I ";" ] } 

[ Variantenteil ] 

Variantenteil: "CASE" [ Bezeichner ":" ] Typ-Bezeichner "OF" 

{ Konstante { Konstante ) . "{" Feldliste ")" 

( ] } 

Bevor ich den „Variantenteil" erläutere, möchte ich darauf hinweisen, daß die Feld-Bezeichner einer 
jeden Feldliste einen eigenen Gültigkeitsbereich haben. Dies bedeutet, daß verscheidene Record- 
Typen gleichnamige Felder haben können und daß ein Feld einen Namen haben kann, der bereits 
vergeben ist. Einzige Bedingung ist, daß innerhalb eines einzelnen Records keine zwei Felder den 
gleichen Bezeichner tragen dürfen. 

Oft kommt es vor, daß man in einem Recordtypen Daten speichern will, tiie sich gering unterschei¬ 
den. Beispiel: Es soll der Warenbestand eines K;iufliau,ses verwaltet werden. Wir begnügen uns 
zunächst mit der Warenbezeichnung, dem Verkaufspreis und einer Warengruppe. Bei 1-ebensmitteln 
wollen wir aber zusätzlich das Verfallsdatum und bei Kleidung die Konfektionsgröße speichern. Der 
erste Versuch mit einem normalen Record und einem Aulziihlungstypen für die Kategorie könnte so 
aussehen: 

TYPE Warengruppe = (Lebensmittel, Kleidung, Sonstiges); 

Ware = RECORD 

Bezeichnung: STRINGtSO]; 



5. Datent>T3en 


133 


Preis: RECORD { Schachtelung von Record-Typenl } 

DM: integer; { Mark } 

Pf: 0..99 { Pfennige } 

END; 

Kategorie: Warengruppe; 

Verfall: RECORD 

Tag, Monat, Jahr: integer 
END; 

Konfgroease: integer; 

END; 

Der Haken an der Sache: Wir benutzen immer entweder das Verfallsdatum oder die Größe oder 
keins von beiden und verschwenden deshalb stets mindestens ein Feld. Das können wir mit einem 
Varianten-Teil ändern: 

Ware = RECORD 

Bezeichnung: STRINQ[50]; 

Preis: RECORD { Schachtelung von Record-Typenl } 

DM: integer; { Mark } 

Pf: 0..99 { Pfennige } 

END; 

CASE Kategorie: Warengruppe OF 

Lebensmittel: (Tag, Monat, Jahr: integer); 

Kleidung: (Konfgroesse: Longint); 

Sonstiges: ( ); 

END; 


Die CASE-Zeile bewirkt zunächst einmal, tlaß ein Feld „Kategorie“ des Typs „Warengruppe“ einge¬ 
richtet wird. Der ganze Rest der Feldliste ist dann ein Varianten-Teil. Jede Variante beginnt mit einer 
Liste von Konstanten (im Beispiel bestehen die „Listen“ jeweils nur aus einer Konstanten), gefolgt 
von einem Doppelpunkt - also ähnlich wie Ixim CASE-Statement. Dahinter folgt jeweils eine 
Feldliste - aber diesmal nicht mit „RECORD".END“, sondern von ninden Klammern umschlossen. 

Die Feldliste kann übrigens auch leer sein, wie Sie in der Zeile „Soastiges“ sehen. 

Was hat das dann zu bedeuten? Die Felder Jag“, „Monat" und .Jabr“ belegen den selben Speicher 
wie das Feld ..Konfgroesse“. Die Zeile für den Fall „Sonstiges“ ist vollkommen überflüssig, fördert 
aber die I.e.sbarkeil, weil dadurch klar wird, daß das Feld „Kategorie“ auch diesen Wen annehmen 
können soll. Als Beispiel dafür, wie man mit solchen Records arbeitet, hier eine Prozedur zur 
Warenau.sgabe: 

PROCEDÜRE Ausgabe(W: Ware); 

BEGIN 

writelntW.Bezeichnung); 

writeln(W.Preis.DM , •.• , W.Preis.Pf); 

IF Kategorie=Lebensmittel THEN 

writeln('Haltbar bis: ', W.Tag, , W.Monat, , W.Jahr) 

ELSE 

IF Kategorie=Kleidung THEN writeln('Größe Konfgroesse ) 


END; 


MaxonPASCAL 


134 


Wie Sie sehen, sind die Felder des Variantenteils ganz normale Record-Felder, nur daß sie sich zum 
Teil überlappen. Eigenüich sollte es zu einer Laufzeit-Fehlermeldung führen, wenn man auf „Tag" 
zugreift, obwohl „Kategorie“ den Wert „Kleidung“ hat. MaxonPASCAL prüft dies aber nicht und 
überläßt es so Ihrer Verantwortung. 

Der Variantenteil sieht zwar auf den ersten Blick wie ein CASE-Befehl aus, aber hier ist kein ELSE- 
Teil erlaubt. Auch können keine Au.sschnitte wie „Konstl..Konst2'' von Konstanten angegeben wer¬ 
den. Jeder Record kann höchstens einen Variantenteil haben. Falls Sie mehr benötigen, können Sie 
das über geschachtelte Records erreichen. 

Beispiel: In unser Record soll noch die bevorratete Menge autgenommem werden, entweder in 
Kilogramm, Litern (Real-Zahl) oder in diversen Stückzahlen (Longlnt). 

TYPE 

Warengruppe = (Lebensmittel, Kleidung, Sonstiges); 

Hass = (Masse, Volumen, Flaschen, Kisten, Stueck); 

Ware = RECORD 

Bezeichnung: STRIHO[50]; 

Preis: RECORD 

DM: integer; 

Pf: 0..99 
END; 

Menge: RECORD 

CASE Einheit: Mass OF 

Masse: (Kilogramm; Real); 

Volumen: (Liter: Real); 

Flaschen, Kisten, Stueck: (Anzahl: Longlnt); 

END; 

CASE Kategorie: Warengruppe OF 

Lebensmittel: (Tag, Monat, Jahr: integer); 

Kleidung: Konfgroesse: Longlnt); 

{ Hier wurde die überflüssige Zeile weggelassen ) 

END; 


Der Mengen-Record besteht auschließlich aus einem Variantenteil (außer dem Feld „Einheit“, das es 
ünmer gibt). In unsere Prozedur .Ausgabe“ können wir nun an geeigneter Stelle folgendes einfügen: 

CASE W.Menge.Einheit OF 

Masse; writeln(W.Menge.kllogramm , 'kg'); 

Volumen: writeln(W.Menge.Liter, 'Liter'); 

Flaschen; writelntW.Menge.Anzahl, 'Flaschen'); 

Kisten: writeln(W.Menge.Anzahl, 'Kisten'); 

Stueck: writeln(W.Menge.Anzahl, 'Stück'); 

END; 


Das Ganze hätte man mit einer WITH-Anweisung abkürzen können, aber das soll jetzt nicht unser 
Thema sein. Statt dessen noch einige Anmerkungen zu „Variant parts“: das Feld hinter dem „CASE“ 
„ kann nicht nur - wie in unseren Beispielen - als Aufzählungstyp, sondern als beliebiger geordneter 
Typ definiert werden, d. h. Boolean, ganzzahlig oder Char. In der Regel drängt sich die Verwendung 



5. Datentypen 


135 


eines Aufzählungstyps aber geradezu auf. Die Konstanten der Varianten müssen aber zu diesem 
Datentyp passen. E,s ist niclit nötig, für alle denkbaren Werte eine Variante anzugeben, z. B. wairde 
im ttbigen Beispiel an Schluß die Zeile für „Sonstiges“ weggelassen. 

Es ist auch nicht erforderlich, ein Feld zum Alispeichern der Variante einzurichten. Wenn aus 
irgendeinem anderen Zusammenhang hervorgeht, welcher Zweig benutzt wird, reicht es, hinter 
dem „C.4SE“ nur einen Typ-Bezeichner anzugeben. 


TYPE 

Komisch = RECORD 

Inhalt: STRING[10]; 

Nummer: Longint; 

CASE integer OF 

0, 1: (Flag: Boolean; 

Operandi, OperandZ: Real); 

2, 3, 4: (Parameter: Real); 

5: (Fehlercode: integer; 

CASE Boolean OF 

true: (Re, Im: Real); 
false: (Wert: Double) 

) 

- 1 : () 

END; 

Hier haben wir auch ein Beispiel für Felddeskriptoren der Typen „Integer“ und „Botriean“ und für 
geschachtelte Varianten-Teile. 

Eine Record-Variable mit Variantenteil belegt stets so viel Speicher, wie die längste Variante 
benötigt. Der Jensen-Wirth-Standard kennt für dynamische (also über Pointer referierte) Record- 
Variablen mit Variant Part eine besondere Version der „NEW"-Anweisung, bei der die gewünschte 
Variante angegeben wird. 'X'äre z. B. „P" ein Pttinter auf den oben definierten Datentypen 
„Komisch“, so würde 

New (P, 5, false) 

für die dynamische Variable „P ^ “ genau so viel Speicher allozieren, wie die Variante „5“ mit 
Llnterrvariante „false“ belegen würde, 

New (P, -1) 

würde entsprechend Platz für eine Variable mit leerem Variantenteil machen uswc Ich verwende 
ixiwußt den Konjunktiv, denn MaxonPASCAL unterstützt dieses Feature nicht. Sie vergeuden also 
evtl, etwas Speicherplatz. 



MaxonPASCAL 


136 


5.9 Typkonvertierungen 

MaxonPASCAI. „managecl" im allgemeinen die Kombinaüon unterschiedlicher Datentypen selbst¬ 
ständig, so daß Sie sich darüber keine Gedanken zu machen brauchen. Der Compiler konvertiert 
Datentypen, wenn es sinnvoll ist (z.B. Integer ung Longint) und meldet Fehler, wenn die Typen 
nicht zusammenpassen, z.B. Real und Pointer. Hin und wieder kommt es aber vor, daß Sie dem 
Compiler Ihren Willen aufzwingen müssen. 

Beispiel: 

Program IntToLong; 

Var a,b:integer; 

Begin a:=26731; b:=20000; writeln(a+2*b) End. 

Da beide Variablen vom Typ „Integer" sind, rechnet das Programm in diesem Wertebereich - und es 
kommt zu einem Überlauf, denn der größte in „Integer“ darstellbare Wert ist Maxlnt=32767. Im 
Bereich „Longint“ könnte der Ausdruck aber korrekt ausgewertet werden. 

Für Sülche (und andere) Zw'ecke gibt es in .MaxonPASCAL die Möglichkeit zur Typumwandlung. 
Dazu verwendet man den Bezeichner des gewoinschten Typs (hier; „Longint" bzw. „Long“) wie eine 
Funktion. 

Beispiel: 

... writeln(Long(a+2*b)) ... 

Dies ist zwar syntaktisch richtig, bringt aber noch keine Verbesserung unseres kleinen Programms, 
denn der .Ausdruck wird nach wie vor zunächst als „Integer" airsgewertet und erst danach in „Long" 
umgewandelt. Wenn Sie den Compiler dazu zwingen wollen, tatsächlich in „Long" zu rechnen, müs¬ 
sen Sie dafür .sorgen, daß die Bestandteile des Au.sdruck.s vom Typ „Long" sind: 

... writeln(Long(a)+Long(2)*Long(b)) .... 

Dieser Ausdruck wird korrekt ausgewertet, ist aber etwas umständlicher als nötig. Es reicht ja 
schließlich, w'enn ein Term „lang" ist, denn dann wird der Rest automatisch umgewandelt. /Aber 
Vorsicht: 

... writeln (Long(a) ■f2*b) ... 

wäre falsch, denn (Punktrechnung vor Strichrechnung!) der Teil- ausdruck .,2*b“ wiixl zuerst in 
„Integer“ ausgewertet und dann erst nach ..Long“ konvertiert! Richtig wäre dagegen; 

wrlteln(a+Long(2) *b) oder writeln(a-f2*I,ong(b) ), 

denn nun wird die Multiplikation korrekt als „Longint“ au.sgcführt und dann die Addition ebenfalls, 
denn der zweite Summand ist ja lang. 



5. Datentypen 


137 


Das klingt jetzt wahrscheinlich alles etwas verwirrend, aber in der Praxis werden Sie mit solchen spe¬ 
ziellen Fällen wohl nur selten zu tun haben. Die Moral aus der Geschieht' ist aber, daß Sie im 
Zw'eifelsfall dem Compiler bei der Typkonvertierung nicht zutnel Freiheit lassen sollten. 

Was wir hier mit „Long" gemacht haben, geht auch mit den vier anderen Ganzzahltypen. Sie können 
damit - falls das einmal sinnvoll sein sollte - Zahlen sogar „verkürzen", also bleistiftsweise von „Long" 
nach „Integer“ oder von „Cardinal" nach „Byte“. 

Noch ein Beispiel: 

Progreun Kardinal; 

Var c:Cardinal; 

Begln c:= 2*25000; writeln(c) End. 

Falls Sie die Compiler-Option „M-ithmetic Overflow“ angewählt haben, wird ein Überlauf gemeldet, 
denn die liier auftretenden Zahlen 2 und 25000 liegen beide sowohl im Integer- als auch im 
Cardinalbereich. 

In diesem Fall wählt der Com|iiler als Rechenbereich „IntegeP' (den Kontext, daß als Ergebnis eine 
Cardinalzahl zwecks Zuweisung an eine solche Variable gewünscht wird, beachtet er nicht). Auch 
hier können Sie ihn zum Rechnen in „Cardinal“ zwingen, in dem Sie eine („Cardinal(2)*2500ü“ bzw. 
„2*Word(25000)“) oder beide Zahlen {„Würd(2)*Word(25000)“) mit „Word" oder „Cardinal" 
zwangskonvertieren. 

Bei all' diesen Beispielen ging es nur darum, einen korrekten Programmablauf zu gewährleisten. Es 
gibt aber auch die Möglichkeit, mit Typumwandlungen'der Syntax ein Schnippchen zu schlagen, 
nämlich bei den Pointern. Denn auch Poiniertypen und der String|iointer „stP‘ können untereinan¬ 
der umgewandelt werden. Außerdem können sie in Longlnt-Zahlen und umgekehrt Zahlen in 
Zeiger verwandelt werden. 


... Var p:‘Typ; ... New(p); writeln(Long(p)); ... 

Dieses Fragment gibt die Adresse (als Zahl!) aus, auf die der Pointer „p“ nach dem „New" zeigt. 

Noch ‘n Beispiel: 

Program Speicherzugriff; 

Var pi^Word; 

w:Word; 

Begin 

p:=ptr($dffl80); 

For w:=0 To MaxWord Do p‘:=w 
End, 

Hier wird der Pointer „p“ ganz gezielt auf die Adresse IdfflBO gesetzt, wo nichts anderes als die 
Hintergiimglärbe des Bildschirms liegt, ln der For-Schleife wird dann diese Farbe schnell geändert. 
Ergebnis: Ein Flimmern, an dem Ihr Augenarat seine Freude haben würde. 



MaxonPASCAL 


138 


Achtung: Setzen Sie einen Zeiger (fast) nie auf eine ungerade Adresse! Der Prozessor MC 68000 
(steckt in Ihrem AMIGA drin - es sei denn, Sie besitzen ein 680x0-Turbo-Board mit x=2,3,4,5,.. oder 
einen Amiga 1200,2500,3000,4000,...) kann 16- und 32-Bit-Zahlen nur von geraden Adressen lesen 
bzw. dahin schreiben. Bei ungeraden Adressen stürzt er auf einfachen 68000 Prozessoren ab (mit 
der Guru Meditation Number $00000003.xxxxxx). Dies sollten Sie also, wie gesagt, fast nie tun. 
„Fast" deshaib, weil 8-Bit-Daten (Byte, Shortlnt, Boolc'an, Char) durchaus an ungeraden Adres.sen 
liegen dürfen. 

Es gibt aber noch viele andere Möglichkeiten zur Typwandlung. Da wären zum einen die geordne¬ 
ten Datentypen, also Boolean, Char, Ganzzahl-, Aufzählungs- und Ausschnittstypen, die allesamt in 
beliebiger Kombination wandelbar sind. So können Sie z. B. „Char(n)'' als Ersatz für die Funktion 
„Chr(n)" oder „Integer(x)“ statt „Ord(x)“ verwenden. 

Das sollten Sie aber besser sein lassen, denn für solche Sachen gibt es ja die erwähnten Standard- 
PASCAL-Funktionen, während Typkonvertierungen eine Spezialität von MaxonPASCAL sind. 
Interessant ist allerdings die Möglichkeit, von Integer nach Aufeählungstypen zu konvertieren, also 
hier „ord“ umzukehren: 

Program Woche; 

Type 

Tage=(Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag,Sonntag); 

Var i: Integer; t: Tage; 

Begin 

For i:=0 to 6 Do 
Begin t:=Tage(i); 

If t In [Samstag,Sonntag] Then 
writeln('Wochenendel') 

End 

End. 

Desweiteren bnn man alle geordneten Datentypen in Pointer und zurück wandeln. Auch in 
Fließkommatypen lassen sie sich wandeln („Real(‘A’)" würde z. B. die Real-Zahi 65 iiefem), aber 
nicht umgekehrt. 

Pointer kann man, wie erwähnt, in andere Pointertypen oder in alle geordneten Datentypen konver¬ 
tieren. „Boolean(NIL)“ wäre z. B. eine besonders umständliche Schreibweise für „false“. 

Die Datentypen „Real“ und „Double“ (bzw. „LongReal“) lassen sich lediglich untereinander umwan¬ 
deln, etwa wenn man eine bestimmte Rechengenauigkeit erzwingen will. 


3. Datentypen 


139 


Hier ist eine Tabelle mit allen direkten Konvertiemngsmöglichkeiten; 

nach: 



geordnet 

Pointer 

Fließkomma 

geordnet 

X 

X 

X 

Pointer 

X 

X 


Fließkomma 

• 


X 


P< = möglich, • = mit Umweg über „Trunc“ und „Round“) 


5.10 Literale für Records und Arrays 

Das AMIGA-Betriebssystem wurde in der Sprache C geschrietren. Dies hatte unter anderem zur 
Folge, daß geradezu exzessiv mit Striicts (=Records) und über Zeiger verketteten Listen gearbeitet 
wurde. 

Wenn Sie von PASCAL aus die Betriebs.systemfunktionen nutzen wollen, müssen Sie deshalb immer 
und immer wieder Records initialisieren. 

Ein Beispiel: Um mit der Intuition-Funktion „OpenWindow“ ein Fenster zu öffnen, benötigt man 
eine Variable des Typs „NewWindow“, der wie folgt tlefiniert ist: 

TYPE 

NevrtJindow = RECORD 

LeftEdge,TopEdge,Width,Height: integer; 

DetailPen.BlockPen: Byte; 

IDCMPFlags,Flags: Long; 

FirstGadget.Checkmark: ptr; 

Title: str; 

Screen.BitMap: ptr; 

MinWidth,MlnHeight,MaxWidth,MaxHeight,_Type:integer 
END; 

Jedem der Felder müssen Sie jetzt einen Wert zuweisen, ln „normalem“ PASCAL sähe das etwa so 
aus: 

VAR Neu: NeWWindow; ... 

Neu.LeftEdge: = 10; Neu.TopEdge: =20; Neu.VJidth: =620; ... 

...oder SO: 

WITH Neu DO 
BEGIN 

LeftEdge:=10; TopEdge:=20; Width:=620; ... 

END; 



MaxonPASCAL 


140 


Das ist natürlich sehr mühsam. Weil dies aber so oft nötig ist, bietet MaxonPASCAL Ihnen hier eine 
interessante Hilfe; Wertzuweisimg auf einen Schlag! ln unserem Beispiel sähe das so aus: 

Neu:=NewWindow(10,20,6 0,160,$200,$100f,Nil,Nil,'Fenster•,Nil,Nil, 
200,50,640,200,1); 

Und dann ist die ganze Struktur schon initialisiert! An diesem Beispiel sehen Sie, wie die Syntax aus¬ 
sieht: Erst kommt der Typbezeichner und dann in runden Klammern, jeweils tlurch Komma 
getrennt, die Weile, welche die einzelnen Felder erhalten sollen, Falls Sie sich mit dem Amiga- 
Betriebssystem nodi nicht so gut auskennen und Ihnen die Bedeutung dieses Records deshalb 
unklai ist: betrachten Sie es „'halt als irgentlso 'n Record“. Das vorher beschriebene geht natürlich 
mit jedem Recordtc-pen, also nicht nur mit denen, die zum Betriebssystem gehören, sondern auch 
mit den von Ihnen selbstdefinierten. 

’OC'elche Vor- und Nachteile hat das Ganze? Nun, es ist schön kurz. Andererseits müssen Sie tlie 
jeweilige Stmktur genau kennen, denn hier kommt es auch auf die Reihenfolge der Felder an. Das 
ist aber nicht so schlimm: bei tler „normalen“ Record-Initialisierung müssen Sie die Struktur eben¬ 
falls genati kennen, um zu vermeiden, daK Sie ein Feld vergessen. Der wohl gravierendste Nachteil 
ist, daß diese Syntax zu keinem anderen P.ASCM. kompatibel ist, schon gar nicht zu ISO-Standard- 
PASCAL. Ihre Programme sind dadurch nicht mehr auf andere Rechner oder Compiler übertragbar. 
Deshalb sollten Sie (im Rahmen der .Vktion „satiberer programmieren“) diese Art der Zuw'eisung nur 
im Zusammenhang mit MIIGA-Betricbssystem-Funktionen vewenden, die ja ohnehin nicht auf 
andere Rechnersysteme übertragbar sind. Hier ist es w'ohl auch am nötigsten. 

Bei Records mit einem sog. Variant Part (mit „GASE“) ist diese Art der Wertzuweisung nicht möglich. 
Dafür geht es aber bei Arrays ganz genau so: 

PROGRAM ArrayDemo; 

TYPE Arr = ARRAY[1..10] of integer; 

VAR 

Feld: Arr; 
i; integer; 

BEGIN 

Feld =Arr(17,4,21,47,11,42,0,8,15,26731); 

FOR 1:=1 TO 10 DO 
wrlte(Feld[i]:7) 

END. 

Beachten Sie bitte, daß auch hier runde Klammern zu verwenden sind. 

Mit einem .ARRAY... ÜF CEAR“ geht tlas übrigens nicht - ist aber auch gar nicht nötig, denn das ist 
ja ein String, unti dafür gibt es bekanntlich viel einfachere Möglichkeiten der Wertzuweisung. 

Seit Version 2.0 von MaxonPASCAL existiert auch die Möglichkeit, mehrdimensionalen /Irrays und 
geschachtelten Records auf diese Weise einen Wert zuzuweisen. Daz.u verwendet man einfach eine 
Klammerebene mehr. 



5. Datentypen 


141 


Beispiel; 

PROGRAM Array2Deino; 

TYPE Arr2 = Array [ l.,3, 0,.l ] OF integer; 
VAR Feld2: Arr2; 

BEGXN 

Feld2:= Arr2({17,4), (42,0), (8,15)); ); 

END. 


Denken Sie daran, daß dieses zweidimensinnale Array lediglich eine Abkürzung für .ARRAY [1..3] 
OF ARRAY |0..11 OF integer" ist. So wird dann auch verständlich, daß wir hier drei Zahlenpaare 
haben und nicht etwa zwei Tripel. Bei höheren Dimensionsanzahlen geht das analog. 

Analog hehandeln wir auch geschachtelte Records: 


PROGRAM RecRecRecDemo; 

TYPE Rec = RECORD 

Ncime; RECORD 

Vor,Nach: STRING 
END; 

Adresse: RECORD 

Strasse: RECORD 

Name: String; 
Hausnummer: integer 
END; 

Ort: RECORD 

Piz: integer; 

Name: String 
END 

END 


END; 

VAR Person: Rec; 

BEGIN 

Person:= Rec(('Zaphod', 'Beeblebrox'), 

(('Industriestraße', 26), (65760, 'Eschborn'))); 

WITH Person DO 
BEGIN 

writein(Name.Vor, ' ', Name.Nach); 

writeln(Adresae.Strasse.Name, ' ', Adresse.Strasse.Hausnummer); 

writeln(Adresse.Ort. Piz , ' Adresse.Ort.Name) 

END 

END. 


.Als kleines Extra lünktioniert diese Schachtelving auch bei Records, die .Arrays enthalten, und bei 
.Arrays of Records“. 

Ein Beispiel für letzteres; 

PROGRAM ArrRecDemo; 

TYPE Kon®lexVektor = ARRAY [1..5] OF RECORD 

Re, Im: Real 
END; 



MaxonPASCAL 


142 


VAR x: KomplexVektor/ 

BEGIN 

X!= Komplexvektor((0,1), (-3,2), (42,0), (8,15), (17,4)); 

END. 

5.11 Dateitypen 

Eine Datei wird in PASCAL durch eine Variable repräsentiert, und die braucht auch einen 
Datentypen: einen FILE-Typen. 

Die Syntax ist denkbar einfach: 

Dateityp = "FILE" [ "OF" Typ ] 

„Typ“ gibt dabei den Typ der Daten an, die in der Datei gespeichert werden scillen, Dabei darf es 
sich nicht um FILE-Typen handeln - was sollte denn wohl auch „FII£ OF FILE OF...“ darstellen? 

Es gibt einen vordefinierten FILE-Typ: „Text“ ist „FILE OF Char“. Und damit wären wir auch schon 
bei den beiden grundlegend verschiedenen Dateitypen: Es gibt Textdateien und Nicht-Textdateien. 
In Textdateien können Daten vieler unterschiedlicher Typen ein- und ausgegeben werden: Char, 
String, Boolean (nur Ausgabe) und alle Zahlentypen, und zwar bei Bedarf alle in dieselbe Datei. Bei 
der Ein- und Ausgabe werden die Daten als Folge von ASCII-Zeichen repräsentiert. 

Nicht-Textdateien, also solche, bei denen der Elementtyp nicht „Char“ ist, sind an ihren festen 
Elementtypen gebunden. Dafür ist dieser aber beliebig (außer, wie bereits erwähnt, Dateitypen). In 
solche Dateien können also nur Daten eines ganz bestimmten Typs ausgegeben bzw. aus ihnen ein¬ 
gelesen werden. Die Daten werden in solchen Files im jeweiligen nicht unmittelbar lesbaren inter¬ 
nen Datenformat abgespeichen. 

Grob gesehen ist eine Datei eine beliebig lange Folge von Daten. Ein Schreib- oder Lesezeiger wan¬ 
den von vorn nach hinten durch diese Datei. Auf das Dateielement, auf dem der Zeiger gerade 
steht, kann man durch die Puffervariable zugreifen: Ist eine Datei als 

VAR Dat: FILE OF Typ; 

deklarien, so heißt die Puffervariable dazu „Dat ^ “ und ist vom Datentyp „Typ". 

Zuerst muß man aber die Datei fürs Lesen oder Schreiben öffnen: 

Reset(Dat) öffnet die Datei, die bereits existieren muß, zum Lesen. 

Rewrite(Dat) öffnet sie für Schreibzugriffe. Falls sie noch nicht existiert, 

wird sie erzeugt. 

Woher „weiß“ das Programm aber, wolche reale Datei, also welches File auf der Diskette o. ä., 
gemeint ist? 



5. Datentypen 


143 


Dazu gibt es zwei Möglichkeiten: 

• Man k;mn der Datei VOR dem Aufruf von Reset/Rewrite mit der Prozedur .Assign“ einen String 
als Namen zuweisen. Beispiel: 

AssigntDat, ■PASCAL:Textdatelen/Textl'); 

Reset{Dat); 

Der Name wird dann nach dem ,Assign“-Befehl in einem Puffer aufliewahrt. Achtung: Dazu ste¬ 
hen nur 30 Bytes zur Verfügung, so daß die Dateinamen nicht länger werden künnenl 

• Man kann auch direkt beim Reset/Rewrite einen Dateinamen als zweiten Parameter angeben, 

Z. B. SO: ‘ 

ResettDat, •PASCAL:Textdateien/Text1'); 

Hier darf der Dateiname beliebig lang sein. 

Falls die Datei nicht geöffnet werden konnte, hat die Funktion JOResult“ einen von 0 verschiede¬ 
nen Wert, die Fehlernummer. Was nun geschieht, hängt davon ab, ob Sie „Reset oder „Rewrite ver¬ 
wendet haben: Im ersten Fall wurde die Datei zum l£sen geöffnet und enthält in der Regel Daten 
(es gibt natürlich auch leere Dateien), die Sie jetzt der Reihe nach lesen können, bis die Funktion 
„EofiDat)“ wahr wird und so das Dateiende anzeigt. Dazu dient die Prozedur „Get“-. 

Get(Dat> 

liest das nächste Element aus der Datei und legt es in der Variablen „Dat ab. 

Get(Dat); Variable:= Dat*; 

kann ersetzt werden durch: 

ReadtDat, Variable); 

Wenn Sie eine Datei mit „Rewrite“ zum Schreiben geöffnet haben, ist sie stets leer. Sie können nun 
Daten in die Datei scbreiben, indem Sie sie zunächst in der Puffervariablen ablegen und dann mit 
der Prozedur schreiben. 

Beispiel: 

Dat*:= Ausdruck; Put(Dat); 

Auch dafür gibt es eine Abkürzung: 

WritetDat, Ausdruck); 

Soviel zur „normalen“ Dateihandhabung von Standard-PASCAL. MaxonPASCAL erlaubt aber auch 
nicht-sequentiellen Dateizugriff, indem man mit der Prozedur „Seek“ den Zeiger an eine beliebige 
Position setzen kann. Ferner kann man auf mit „Reset" geöffnete Dateien auch schreibend zugreifen, 
wobei jeweils die Daten, auf denen der Dateizeiger gerade steht, überschrieben werden. 



MaxonPASCAL 


144 


Außerdem gibt es noch typfreie Dateien. Sie werden einfach als „FILE“ ohne Tvpangabe deklariert 
z. B. SO: . o . 

VAR Datei: FILE; 

ln diesem Fall gibt es dann keine Puffervariable („Datei ^ “), so dal,^ auch die Prozeduren ..Get“ und 
„Pur nicht benutzt werden können. Nur mit den Prozeduren „BlockReact und ..BlockWriie" kann 
aus typfreien Dateien gelesen bzw. in sie geschrieben werden. 



6. Variablen und Konstanten 


143 


6. Variablen und Konstanten 


6.1 Standard-Variablen 

MaxonPASCAL stellt folgende Standard-Variablen zur Verfügung: 

Input, Output (Text) 

Die Standard-Ein- und Ausgabedateien 
Zeiger auf die Basisadresse der Dos-Library. 

MathBase (Ptr) 

Zeiger auf die "Mathffp.libraiY' 

MathtransBase (Ptr) 

Dieser Pointer zeigt auf die Basisadresse der Mathtrans-Library. Aber Achtung: Diese Library liegt 
nicht im ROM, sondern mull von der Systemdiskette nachgeladen werden. Deshalb wird sie nur bei 
Bedarf geöffnet, d. h. sobald eine Funktion daraus aufgenifen wird, 

FromWB (Boolean) 

Jedes AMIGA-Programm kann im Prinzip auf zw'ei sehr unterschiedliche Arten gestartet werden: Von 
der Workbench oder vom CLl. Die Unterschiede liegen zum einen in der Art der Parameterübergabe 
(beim CLl-Stan kann eine Zeichenfolge ütergeben werden, beim Benchstart können evtl, andere 
Icons aktiviert sein) und zum anderen bei tler Ein-,4Au,sgabe (im ersten Fall steht Ihnen dazu das CLl- 
Fenster zur Verfügung, im anderen Fall müssen Sie sich zuerst ein Fenster öffnen - bitte beachten 
Sie dazu auch das Demoprogramm “Wli.p”). 

Die Variable ‘TromW’ gibt Ihnen nun die Möglit;hkeit, festzustellen, wie Ihr Programm gestartet 
wurde. Sie ist (klar) “true” genau dann, wenn der Aufruf von der Workbench erfolgte. 

Die MaxonPASCAI.-Fntwncklungsumgebung simuliert übrigens einen CI.I- Start, d. h. wenn Sie Ihr 
Programm von don starten, hat FromWB stets den W'ert "false”. 

ParameterStr (Str) 

Dieser Stringzeiger zeigt auf tlie Zeichenfolge, die, wie oben erw'ähnt, beim CLl-Stan dem Programm 
übergeben wurde. 

RarameterLen (Integer) 

Der Parameterstring endet nicht notwendig mit einem Nullbyte, deshalb enthält diese Variable die 
Länge. 

StartupMessage (Ptr) 

Beim Programmstart von der W’orkbench wird eine Message übergeben, die verschiedene 
Informationen enthält. Das Laufzeiesystem von MtixonPASCAL holt diese Nachricht ab und beant- 


MaxonPASCAL 


146 


wortet (ReplyMsg) sie am Ende auch, so daß Sie sich darum nicht zu kümmern brauchen. Sie kön¬ 
nen sie aber mit Hilfe der Pointervariablen "StartupMessage” auswerten. 

Mem (Array [O..MaxLongInt] of Byte absolute 0) 

Dieses Feld repräsentiert den byteweise organisierten Hauptspeicher des Rechners. Dadurch sind 
einfache Speicherzugriffe möglich. 


6.2 Vordefinierte Konstanten 

Es gibt folgende vordefinierte Konstanten: 


True 

False 

MaxInt 

MaxLong 

MaxLongInt 

MaxCard 

MaxWord 

MaxShortCard 

MaxByte 

MaxShort 

MaxShortInt 

Pi 


logischer Wert “wahr” 
iogischer Wert “faisch” 
größte Integer-Zahl (32767) 
größte Longlnt-Zahi (2147483647) 
anderer Name für “MaxLong” 
höchste Cardinal-Zahl (65535) 
anderer Name für “MaxCard" 
größte 8-Bit-Cardinalzahi (255) 
anderer Name für “MaxShortCard” 
größte 8-Bit-lntegerzahi (127) 
anderer Name von “MaxShort” 

= 3.14159265358979 



7. Prozeduren und Funktionen 


147 


7. Prozeduren und Funktionen _ 

MaxonPASC^L beherrscht alle Prozeduren und Funktionen des Standards - außer „Pack“ und 
„Unpack“, denn Datenstrukturen werden automatisch gepackt verwaltet. Daneben gibt es aber noch 
viele zusätzliche Befehle für alle Bereiche der PASCAI.-Programmierung. 

7.1 Ein- und Ausgabe 

Write [ (Write-Rarameterliste) ] 

Syntax für Write-Parameterliste; 

(Dateivariable I Write-Parameter) ( Write-Parameter ) 

Sw tax für Write-Parameter; 

Ausdruck [ ":" Ausdruck [ ":" Ausdruck ] ] 

Dies ist die Standard-Ausgabeprozedur. Sie kann prinzipiell ohne Parameterliste verwendet werden - 
dann gibt sie nichts aus und ist also überflüssig. Die Parameterliste ist eine geklammerte Liste von 
durch Komma getrennten „Write-Parametern“ (siehe Syntax), von denen der erste auch eine 
Variable eines Filetyps sein kann. Falls letzteres nicht der Fall ist, so ist „Output“ Default- 
Au.sgabedatei. 

Ist die Au,sgabedatci vom Typ „Text“, also „FILE OF Chaf, so haben Sie viele verschiedene 
Ausgabemöglichkeiten: die nachfolgenden Parameter dürfen von numerischen, booleschen, Char- 
und Stringtypen sein, ln jedem Fall darf hinter dem Write-Parameter, mit einem getrennt, die 
gewünschte Feldbreite für rechtsbündige Ausgabe stehen. 

Fehlt sie, so gibt MaxonPASCAl, grundsätzlich linksbündig aus. Bei der Ausgabe von Real-Werten 
darf man auch noch einen zweiten Parameter für das gewünschte Ausgabeformat angeben. Näheres 
dazu finden Sie im Abschnitt über Glcitpunkttypen. 

W'enn die spezifizierte Ausgabedatei keine Textdatei ist, so müssen alle nachfolgenden Parameter 
zum Elementtypen der Datei typkompatibel sein, ln eine Datei des Typs ..FILE OF Real" könnte man 
z. B. einen beliebigen numerischen Wert schreiben. Wenn „f eine Dateivariable eines solchen Typs 
ist, so wäre 


Write (f, X, y) 

äquivalent zu; 

X ; Put (f) ; 
f*:= y , Put (f); 



MaxonPASCAI. 


148 


Näheres ■/.u„Put'' finden Sie ini Kapitel 7.2 „Dateieir“. 

WriteLn [ (Write-Rarameterliste) ] 

Vi'rite-Parameteriiste: Wie bei„Wr;7e“ 

Diese Pmzedur ähnelt .,Write'\ ist aber nur bei Textdateien möglidi. Nach Ende der Ausgabe wird 
eine neue Zeile angefangen. Hier ist es desofteren siiinvt)ll, die Parameterliste ganz wegzulassen: 
Dadurch ward ein Zeilenvorschub in der Standard-Au.sgabe bewirkt. 


Read [ (Read-Rarameterliste) ] 

Syntax für Read-Parameterliste: 

variable { "," Variable } 

Die Standard-Eingabeprozedur. Wie bei „Wrile“ kann auch hier die Parameterliste weggelassen wer¬ 
den, was aber keinen sinnvollen Befehl ergibt. Die Parameterliste, .sofern vorhanden, ist eine Dste 
von durch Kommata getrennten Variablen, Analog zu „Write“ darf auch hier der erste Parameter 
eine Eile-Variable sein, sonst wird JnpiH" als Default-Eingabekanal benutzt. Auch hier gibt es eine 
Unterscheidung zwischen Text- und Nicht-Text-Dateiem 

Ist die Eingabedatei vom Typ „Text" (wie z. B. tlie Datei „Input"), so sind als Parameter Variablen 
von numerischen, Char- und Stringtypen erlaubt. Es werden dann jeweils Zeichen aus der 
Eingabedatei gelesen und in den gewünschten Typen konvertiert. 

Bei Nicht-fext-Eingabedateien mü.ssen alle Parameter Variablen sein, die zum Elenienttyp der Datei 
typkompatibel sind, insbesondere dieselbe „Breite“ halxtn müs.sen. Hier werden direkt die Daten 
und nicht eine lesbare Repräsentation der Daten geic.sen. 

Die Dateihandhabung von Standardpascal ist nicht mehr ganz zeitgemäß und mußte bei 
•MiixonPASCAL leicht variiert w'erden: 

Read(datei,variable) 
entspricht deshalb: 

Qet (datei) ; Variable:= datei'' 
und nicht (Wirth: PASCAL Report, Ktip, 11.4.1): 

variablejs datei'' ; Get(datei) 

Desweiteren wird„Abf'' erst „true“, wenn das Dateiende wirklich erreicht wurde, d. h. eventuell (bei 
Textdateien) erst dann, wenn nichts mehr gelesen werden konnte und die Variable dadureb Undefi¬ 
niert ist. Dies läßt sich in der Regel durch Verwendung von „SeekEoF“ statt „EoF“ vermeiden. 



7. Prozeduren und Funktionen 


149 


ReadLn [ (Read-Parameterliste) ] 

Wie Read, aber nur bei Textdateien mdglich, 

ReadLn (Parameter) 

entspricht 

Read(Parameter); ReadLn 

und „ReadLn “ entspricht wiederum 

While not eoln(datei) do Get(datei) 

im Klartext; Alles, was in der Eingabezeile noch hinter dem gelesenen Teil steht, wird iiberlesen. 

Page [(datei)] 

datei: Variable eines File-typs, Default ist „Output“ 

Erzeugt Seitenvorschub oder -Wechsel. Heim Bildschirm tedeutet dies Löschen. 

ClrScr [ (datei) ] 

ebtei: Text-File 

Antlerer Name von „Page“ (wurde aus Gründen der Kompatibilität implementiert). 

GotoXY (x,y) 

X, y; Integer 

Setzt den Cursor in Spalte x, Zeile y. Die linke obere Ecke des Ausgabefensters hat die Koordinaten 

( 1 , 1 ). 

ClrEol 

löscht die Zeile ab Cursor. 

InsLine 

fügt auf dem Bildschirm eine Zeile ein, d. h. der Text unterhalb der Zeile, in der der Cursor steht, 
wird nach unten gescrollt. 

DelLine 

Gegenteil von „MLine“: Die Zeile, in der der Cursor steht, wird gelöscht, alles, was darutiter steht, 
um eine Zeile nach oben gescrollt. 



MaxonPASCAL 


150 


EoF [ (datei) ]: Boolean 

datei: Variable eines Filetyps, Default ist „input" 

Dateiende- und Dateifehler-Funktion. EoF(input) ist übrigens immer „false“. 

Eoln [ (datei) ]: Boolean 

datei: Variable des Typs „text“, Default ist „input“ 

Meldet Zeilenende bei Read/ReadLn aus Textdateien. 


SeekEoLN [ (datei) ]: Boolean 

datei: Textfile-Variable, Default ist „input". 

Diese Funktion entspricht dem normalen ..EoLN“, allerdings werden hier Leerzeichen überlesen. 
Beispiel: 

Var i, j: integer; 

Begin 

write('Bitte Zahlen eingeben: '); i:=0; 

Repeat 

read(j); i:=i+j 
Until EOLN; 
writeln('Summe: ’.i) 

End. 

Dieses Programm liest von der Standardeingabe eine Zeile voller Zahlen und berechnet die Summe 
der Zahlen. Problem: Wenn der Benutzer hinter der letzten Zahl ntK’h ein Leerzeichen eingibt, wird 
das Zeilenende nicht erkannt. Das kann behoben werden, indem man „EoLN“ einfach durch 
„SeckEoUS“ ersetzt. 

SeekEoF [ (datei) ]: Boolean 

datei: Textfile-Variable, Default ist „input". 

Analog zu „SeekEoLN prüft diese Funktion „EoF", wobei Leerzeichen und Zeilenenden überlesen 
werden. Im Gegensatz zum normalen EOF arbeitet „SeekEoF" nur auf Textfiles. 


EmptyLN [ (datei) ]: Boolean 

datei: Textfile-Variable, Default ist „input“. 

Diese Funktion liest eine Zeile aus der Textdatei in den Puffer, überliest führende Leerzeichen und 
stellt dann fest, ob die Zeile leer ist. 



7. Prozeduren und Funktionen 


151 


Anwendungsbeispiel: „Read“ wartet teim l^sen von Zahlen stur darauf, daß eine Zahl eingegeben 
wird - da hilf kein RETURN-Driieken, Mit der EmptyLN-Funktion können Sie zuvor prüfen, ob der 
Benutzer etwas einzugehen gedenkt. 


Var i: integer; 

Begin 

i:=$0815; 

writeln('Alter Wert: 

writet'Neuen Wert eingeben oder mit RETURN bestätigen: '); 

If not EmptyLN Then readln(i); 
writelnt'Neuer Wert ist: ',i) 

End. 

ln dem Moment, wo die Funktion „EmptyLT aufgerufen wird, wartet das Programm darauf, daß der 
Benutzer etwas eingibt und RETURN drückt, und es wird geprüft, ob die Eingabe leer ist, d. h. ob er 
einfach nur „RETURN“ getippt hat. Die Funktion „EmptyLN“ liest selbst aber noch nichts - abgese¬ 
hen vttn Leerzeichen, die überlesen werden. 

Nur wenn in der eingegebenen Zeile wirklich etwas steht, liest das obige Programm dies mit 
„Readln(i)“ ein, andernfalls behält „i“ den alten Wert. 


7.2 Dateien 

Reset (datei [, name ]) 

datei: Variable eines FILE-Typs 

name: Stringkonstante oder -Variable 

Eine Datei wird zum Lesen und Schreiben geöffnet. Dabei kann - als Erweiterung des ISO-Standards 
- optional ein Dateiname angegeben werden. Wird er weggelassen, so muß zuvor mit dem „ASSIGN“- 
Befehl ein Dateiname zugewiesen worden sein. 

Reset in der erweiterten Form (d. h. mit Dateinamen) übernimmt den String nicht in den Puffer, so 
daß einerseits keine Längenbeschränkung besteht, andererseits aber keine Stringausdrücke verwen¬ 
det werden können. 

Die Datei muß bereits existieren. Konnte sie nicht geöffnet werden, so wird kein Fehler gemeldet! 
Vielmehr gilt dann „Eof(datei)=true“ und „lOResultoO“. Sie müssen den Fehler also selbst 
abfangen, bzw. das [.aufzeitsystem meldet bei der nächsten Ein- oder Au.sgabeoperation auf dieser 
Datei einen „File not open"-Error. 



MaxonPAS(]AL 


152 


Rewrite (datei [, name ]) 

datci: Variable eines FlUi-typs 

name: Stringkonstante oder -Variable 

Eine Datei wird für Sebreibzugriff geöffnet. Nach erfolgreichem „Rewrile“ ist die Datei völlig leer, 
und der Lesezeiger steht am Anfang. Dies ist der (wichtige) Unterschied zu „Reset“, wonach man 
außer lesen zwar auch schreiben kann, aber dabei lediglich den alten Dateiinhalt überschreibt. 


Get (datei) 

datei: Variable eines Dateityps 

Daten in Pufferdatei ^" lesen. 


Put (datei) 

datei: Variable eines File-Ttps 

Puffer „datei ^ “ in Datei schreiben. 

Close (datei) 

datei: Variable eines File-Typs 

Wenn Sie eine Datei mit „Reset“ oder „Rewrite“ geöffnet halten, müssen Sie sie nach Gebrauch mit 
dem „Close“-Befehl wieder schließen. Falls Sie das nicht tun, wird es am Programmendc automa¬ 
tisch durchgeführt. 

Assign (datei, name) 

datei: Variable eines FII.E-typs 

name: Stringausdruck 

Einer Datei wird ein externer Dateiname zugewiesen. Dies ist nötig, ckirnit das Laufzeitsystem beim 
an.scbließenden „Reset“ oder „Rewrite“ dieser Datei w'eiß, welche reale Datei angesprochen werden 
soll. 

Der Dateiname wird in einen zur Filevariablen gehörenden Puffer übernommen, der 30 Bytes lang 
ist. Mit dem Nullbyte am Ende kann ein mittels „Assign" zugewiesener Dateiname also maximal 29 
Zeichen iang sein. Falls das nicht reicht, gibt es alternativ die erweiterten Versionen von „Reset“ und 
„Rewrile“ (s. u,), die ohne vorheriges „Assign“ auskommen, 


7. Prozeduren und Funktionen 


153 


lOResult: integer 

Nach jeder Ein- und Ausgaheoperation von MaxonPASCAL, also z. B. „Reset", „Rewrite“, „Read", 
Jeek“ usw. wird diese Funktion mit der vom Betriebsysiem gelieferten Fehlernummer initialisiert, 
also „0“, wenn alles klar ist, und einen Wert „>0“, wenn ein Fehler auftrat. 


Var f: text; 

Begin reset(f,’yxlegrümpf'); writelntlOResult) End. 

liefert, falls nicht zufällig eine Datei ntimens „yxiegrtimpf existiert, die Fehlernummer 205; „Object 
not found". 


Filehandle (datei): Longlnt 

datei: Dateivariable 

Diese Funktion liefert zu einer PASCAI.-Dateivariablen die zugehörige Dateihandle, so daß Sie auf 
die Datei auch mit den Befehlen tler Dos.libraiy arbeiten können. Beispiel: 

{$path "Pascal:include/"; incl"libraries/dos.h" } 


Var f: text; 

e: integer; 
c: Char; 


Begin 

resettf, •CON:0/0/640/200/Kein CLI'); 
If IOResult=0 Then exit; 
e:= Execute('dir'$a’endcli', 
filehandle(f), 
filehandle(f)); 


{ Fenster öffnen } 
{ Fehler abfangenl 
{ Befehlsfolge } 

{ Eingabedatei ) 

{ Ausgabedatei } 


writelntf); 

writelntf,'Fehlercode war:',e); 
writelntf, 'RETURN drüctcenl ' ) ; 
readlnt f,c); 
close(f) 

End. 


) 


Dieses Programm öffnet mit „Reset" ein Fenster und läßt darin vom DOS die Befehle „Dir" und 
„EndCU" ausführen (letzterer ist wichtig, .sonst hängt das DOS sich auf!). Die Befehle müssen durch 
das Zeichen #Ja, also ein „Lmefeed", getrennt werden. 

Beachten Sie bitte; - „Filehandle“ prüft nicht, oh die Datei auch wirklich geöffnet wurde. Falls dies 
nicht der Fall sein sollte, ist das Ergebnis imdcfiniei't. 

I®' Wenn das Programm aus tlem P.ASCAl.-System oder von der Workbench gestartet wird, sind 
„Filehandle(input)“ und „Filehandle(output)“ undeliniert. Wenn der Programmstart vom (iD 
erfolgte, liefern die beiden Ausdrücke die Handle der Standardein- bzw. Ausgabedatei, 



MaxonPASCAL 


154 


‘S’ Mit DOS-Aufrufen können Sie die interne Dateiliandhalwng des PASCAL durcheinanderbrin¬ 
gen. Generell sind JioF', „EoLN“, „FilePos“ und „PüeSize“ einer Datei nach einem derartigen 
Aufruf Undefiniert. 

„DosClose(FUehandle(...))“ ist absolut tabu - Gurugefahr! 

Seek (datei, position) 

datei: File-Variable 

Position: Gany-zahliger Ausdruck 

Setzt den Schreib-/Lesezeiger einer zuvor mit „Reset" geöffneten Datei auf eine bestimmte Position. 
Die erste Position bat die Nummer 0. 

Eine „Position" ist ein Element des Datei-Grundtyps, bei „Text“ also ein Char ( = 1 Bv-te), bei „File of 
integer“ ein 2-Byte-Wort usw. 

Nach „Seekffi“ ist die Pufferv-ariable „f^“ noch nicht initialisiert. Es muß also (wenn's unbedingt 
sein muß) noch „Get(l)“ autgerufen werden. 


Filepos (datei): Longint 

datei: File-Variable 

Gibt die Position des Schreib-ZLesezeigers in einer zuvor mit „Reset" geöffneten Datei an. Nach 
„Seek(datei,n)“ liefert „Filepos(datei)“ beispielsweise den Wen n, vorausgesetzt, die Datei ist ent¬ 
sprechend lang. 

FUesize (datei): Longint 

datei: File-Variable 

Liefert die Größe einer zuvor mit „Reset" oder „Rewrite" geöffneten Datei. Im allgemeinen wird die 
Größe aber nicht in Btnes oder Blöcken angegeben, sondern in Elementen des Datei-Grundtyps, so 
daß diese Funktion ohne Umformung 7.\\„Seek" mA „FilePos“ kompatibel ist. Beispiel: 

Var f: Text; 

Begin 

roset (f, '8:startup-sequence'); 
seek (f, filesizetf)); 
writeln (f, 'echo "Hallol"'); 
dose (£) 

End. 

Dieses Programm öffnet die Startup-sequence, setzt den Zeiger auf das Dateiende und hängt dort 
mittels „writeln“ einen CU-Befehl an. 



7. Prozeduren und Funktionen 


153 


Buffer (datei, groesse) 

datei; Variable eines beliebigen FILE-Typs 
groesse: gewünschte PiiffergrölSe in Bytes 

Die Dateizugriffe eines Programms erfolgen intern über die DOS-Dbrary des Betriebssystems, die 
das Filesystem benutzt, welches wiederum über Devices (Gerätetreiber) auf die Hardware zugreift. 
Wir haben es also mit einem ziemlichen Aufwand zu tun, der jedesmal getrieben wird, bevor auch 
nur ein einziges Byte gelesen oder geschrieben werden kann. 

Schlimmer noch: Dieser Überbau muß bei jeder einzelnen Dateioperation erledigt werden und ist 
vom Umfang der anschließend zu übertragenen Daten unabhängig. Sie können sich denken (oder 
mußten es bereits erfahren), was dann bei Textdateien, bei denen ja zeichenweise gelesen und 
geschrieben werden muß, passiert: Für jedes übenragene Byte muß die gesamte Maschinerie in 
Gang gesetzt werden. Selbst die wohl kaum als überragend schnell zu bezeichnenden MIIGA- 
Diskettenlaufwerke sind dann so schnell, daß die eigentlichen Diskettenzugriffe verglichen mit der 
enormen Zeitverschwendung durch das Betriebssystem kaum noch Zeit brauchen. Vielleicht ken¬ 
nen Sie noch das IFF-Ladeprogramm, das bei KICKPASCAI. 1.0 als Beispielprogramm beilag: Es war 
scheußlich langsam, aber nicht etwa, weil KICKPASCAL so schlechten Code erzeugt hätte, sondern 
weil die Bilddaten im wesentlichen byteweise gelesen worden mußten. 

Viel effektiver wäre es doch, für eine Datei einen großen Puffer im IIVM einzurichten. Bei 
Schreiboperationen könnte man die Daten erst einmal in diesem Puffer ablegen und dann in einem 
Rutsch (und mit einem einzigen DOS-Aufruf) schreiben, .sobald der Puffer voll ist. 

Umgekehrt könnte man bei Leseoperationen zuerst einen großen Datenblock in den Puffer lesen 
und dann von don ohne weitere DOS-Benutzung die Daten weiterverarbeiten. 

|aaa, werden Sie jetzt vielleicht sagen, das klingt zwar alles recht sinnvoll und einleuchtend, aber die 
Verwaltung eines solchen Pufferspeichers bedeutet doch einen hohen Programmieraufwand...? 
Keine Panik - MaxonP.ASCAL kann mit der Vmieduv „Buffer“ solche Speicher vollautomatisch (und 
für Ihr übriges Programm unsichtbar) verwalten. Die Prozedur benötigt nur zwei Parameter: zum 
einen eine Dateivariable, die zuvor mit „Resel“ oder „Rewrile“ geöffnet worden sein muß, und zum 
anderen die gewünschte Puffergröße in Bytes. Hier bringen w'enige kBytes schon eine deutliche 
Geschwindigkeitserhöhung; über 10000 Bytes zu gehen, ist in der Regel nicht sinnvoll. Das 
Programm läuft dann ganz genau wie zuvor, nur daß eben die Dateioperationen beschleunigt wer¬ 
den. 

Dazu noch ein paar Hinweise: 

IS’ Wurde die Datei mit „Reset“ geöffnet, wird der Puffer nur für Leseoiaerationen benutzt und bei 
jedem „'Write“ geleert. 

cä- Nach „Seek“ wird der Lesepuffer automatisch entleert. Deshalb kann es passieren, daß ein 
Programm sogar verlangsamt wird, wenn es in einer Datei dauernd hin und her springt. 



MaxonPASCAI. 


156 


w Zwisdien Öffnen und Schließen einer Datei kann die Puffergröße für diese Datei höchstens ein¬ 
mal festgelegt werden. Weitere Aufmfe von „Buffer'’ werden ignoriert. 


BlockRead (datei, variable, anzahl) 

datei: zum Lesen geöffnete Dateivariable 

variable: beliebige Variable, in die Daten gelesen werden sollen 

anzahl: Anzahl der zu lesenden Datenblöcke 

Oft ist der Inhalt einer Datei nicht so strukturiert, daß man sie sinnvoll als ,.FILE OF <Tvp>" dekla¬ 
rieren konnte. Man denke nur an die diversen IFF-Formate, die aus unterschiedlich aufgebauten 
Hunks verschiedenster länge bestehen. Deshalb gibt es die Prozedur „BlockRead“, die aus einer 
beliebigen Datei Daten beliebiger Art und Länge in eine beliebige Variable liest. ..anzahl“ ist dabei 
die .Anzabl ticr Datenblöcke, die jeweils dem Eletnenttyp der Datei entsprechen, ist sie als „FILE OF 
Typ“ deklariert, so werden anzahl * SizeOffTyp) Bytes gelesen. Bei einer Textdatei entspräche ein 
Datenblock also einem einzelnen Zeichen, bei typfreien Dateien wird als Datetisatztyp „Byte“ ange- 
notntnen. 


VAR t: Text; 

s: String[1000]; 

BEGIN 

Reset (t, '8:Startup-Sequence'); 

If FileSize (t) >= 1000 Then 
Error ('Datei ist zu langt'); 

BloclcRead {t, s, FileSize (t)); 

B [FileSize (t) * 1]:= chr(O); [ Stringende markieren } 
Writelnts) 

END. 

Das Programm liest die komplette Startup-Sequence in eine Stringvariable und gibt sie aus. 


BlockWrite (datei, variable, anzahl) 

datei: zum Lesen geöffnete Dateivariable 

variable: beliebige Variable, in tlie Daten gelesen werden sollen 

atizahl: Anzahl der zu lesenden Datenblncke 

Atialog zu „BlockRead“ schreibt „BlockWrile“ Daten aus einer Variablen beliebigen Typs in eine 
Datei. 



7. Prozeduren und Funktionen 


157 


7.3 Arithmetische und andere Funktionen 

Alle in ilieseni Abschnitt vorgestellten Funktionen sind Bestandteil des Jensen-Wirth-Standards. 
Einige von ihnen mtißten natürlich fiir die zusätzlichen Datentypen von MaxonPASCAL enveitert 
werden. Sie sind in alphabetischer Reihenfolge aufgeführt. 

Abs(num): Numerisch 

num: Real- oder Ganzzahlaustlruck 

Betrag von Gleitpunkt- oder Ganzzahldaten. Das Ergebnis ist stets vom selben Typ wie der 
Parameter. 

ArcTan(x): Real 

X: Real-Ausdruck 

Arcustangens-Funktion. Wie die meisten Real-Funktionen, wird auch diese der Mathtrans.library ent¬ 
nommen, w'elche hei Bedarf geöffnet wird. Die l.ihraiy liegt aber nicht im ROM, sondern mulä vom 
.,libs:"- Verzeichnis der Sv-stemdiskette geladen werden. Ist diese nicht vorhanden, wird ein Fehler 
gemeldet. 

Chr(i); Char 

i: Integer-Ausdruck, Bereich Ü..255 

Liefert das Zeichen mit dem Ascii-Code i. Umkehrfunktion ist „ord(c)“. 


Cos(x): Real 

X: Real-Ausdruck 

Die wohlbekannte Cosinus-Funktion. Bei dieser und allen anderen trigonometrischen Funktionen 
müssen die Winkel - wie in der Mathematik üblich - im Bogenmaß angegeben werden. Aus einem 
Gradwinkel erhält man die zugehörige Bogenmatszalil, indem man durch 180 teilt und mit Pi multi¬ 
pliziert - die andere Richtung geht entsprechend genau andersrum. 


Exp(x): Real 

X: Real-Ausdruck 

Dies ist die Exponentialfunktion zur Basis e (Euler'sche Zahl). Die zugehörige Umkehrfunktion ist 

„bl“. 



MaxonPASCAL 


158 


Lq(x): Real 

X: Real-Ausdruck, x>ü 

Ergibt den natürlichen Logarithmus von x. 

Odd(i); Boolean 

i: Ganzzahl-Ausdruck 

Odd(i) ist „true“ genau dann, wenn i ungerade ist. 

Ord(o): Integer oder anderer Ganizahltyp 

0 : Ausdruck eines geordneten Typs (Ganzzahl, Boolean, Char, Aufeählungstyp) 

Liefert die Ordnungszahl des Ausdrucks in den Klammern, Ist dieser Au,sdruck von einem 
Ganzzahltyp, ist das Ergebnis vom sellxtn Typ und auch vom selben Wert (so daß die Funktion hier 
unsinnig ist). .Andernfalls ist das Ergebnis vom Typ „Integer". 


Pred(o): ordinal 

ü; Wie bei „Ord(o)“ 

Die Vorgänger-Funktion, Das Ergebnis ist stets vom selben Typ wie der Parameter und ist der Wert, 
dessen Ordnungszahl um 1 kleiner ist als der des Parameters. Beispiel: 

Pred(26731)=26730, Pred('Y*)=‘X•, Fred(true)=£alse. 

Pred(false) oder Pred(chr(0)) sind eigentlich Undefiniert, es kommt aber zu keiner Fehlermeldung. 


Round(x): Longint 

x: Real-Ausdruck, abs(x) < = Max].onglnt 

Gerundeter Wert von x. 

Sm(x): Real 

X: Real-Ausdruck 

Die beliebte Sinus-Funktion. Natürlich betrachtet auch sie den Parameter als Winkel im Bogenmaß 
(vgl. „Co,s(x)“). 

Sqr(nuni): numerisch 

num: Numerischer Ausdruck 

Berechnet das Quadrat des Parameters. Das Ergebnis ist stets vom .selben Typ wie der Parameter. 



7, Prozeduren und Funktionen 


159 


Sqrt(x): Real 

X: Real-Ausdruck, x > = 0 

Berechnet tlie Quadratwurzel des Parameters 

Succ(o): ordinal 

0 : wie bei „ord(o)'' und „Pred(o)“ 

Diese Funktion ist das Gegenstück zu „Pred“, d.h. sie liefert den Nachfolger eines Ausdrucks eines 
geordencten Datentc'ps. 

Trunc(x): Longint 

x: Real-Ausdruck, abs(x) < = MaxLonglnt 

Liefert den Ganzzahl-Anteil'von „x“. Im Gegensatz zu „Round“ wird hier nicht gerundet; vielmehr 
werden die Nachkommastellen einfach weggelassen. 


7.4 Pointer 
New(point) 

point: Variable eines Pointenyps 

Speiclierplatz für eine dtmamische Variable reservieren und „point“ darauf .setzen. 

Bei Records mit Variantenteil wird immer die maximale Größe reservien. Die Version 
.,New(point,feldl,feld2,...)“ ist nicht implementieit. 

Dispose( point) 

point: Variable eines PointerU'ps 

Dynamische Variable löschen, Speicher freigeben. 

DisposeAU 

Alle dynamischen Variablen tintl alle von AllocMern resenaerten Speicherbereiche werden freigege- 
hen. Dies ist keine Standard-PASCAL- Prozedur. 



MaxonPASCAL 


160 


7.5 AMIGA-Spezifisches 

Alloc Mem (len, cond): Longint 

len (l/)nglnt): gewünschte Größe in Bytes 

cond (Longint): Bedingungen 

Diese Funktion entspricht im Prinzip der Exec-Funktion „AllocMem“. 

Der AMJGA ist - wie Ihnen wohl kaum entgangen sein dürfte - multitaskingfiihig, d.h. mehrere 
Programme können gleichzeitig laufen. 

Dtts führt natürlich dazu, daß ein Programm nicht so ohne weiteres auf den Speicher zugreifen 
kann, denn es besteht ja immer die Gefahr, daß sich dabei zw'ei Programme ins Gebege kommen. 
■■Mso muß sich ein Programm bei Bedarf vom Betriebssystem Speicher reservieren lassen. Genau das 
tut nun .\llocMem bzw. ^\lloc_Mem. Dabei ist ,,Len“ die gewünschte Größe des Speichers. 

Bei „Cond" können Sie bestimmte Bedingungen angeben. Fdne 2 (genannt ME.MF_CHIP) bewirkt z. 
B., daß der Speicher im sog. Chipmemon' liegt, bei ÜIOOÜO (MEMF_CI.EAR) wird der Speicher auto¬ 
matisch gelöscht (mit Nullen gefüllt). Wenn Sie keine besonderen Ansprüche stellen, geben Sie ein¬ 
fach cond=0 an. 

Das Ergebnis der Funktion ist die Anfangsadresse des soeben reservierten Speichers. Was unter¬ 
scheidet nun diese MaxnnPASCAI.-Funktinn von der fast gleichlautenden Exec-Betriebssystem- 
Funkticm? 

Zum einen steigt Alloc_Mem mit einer Feblermcitlung aus, wenn kein Speicher reserviert werden 
konnte (z.B. w'eil schon alles belegt war). Zum anderen führt das Laufzeitsystem von MaxonPASCAI. 
über die AIIoc_.Mem-Funktion quasi Buch, so daß alle reservierten Speicherbereiche am 
Programmende automatisch wieder freigegeben werden. Das können Sie aber auch „manuell“ 
machen: Der entsprechende Befehl heißt Free_Mem. 


Open Window (X, Y, W, H, Farbe, IDCMP, Flags, Name, Screen, MinW, 
MinH, MaxW, MaxH): Ptr 


X (Integer): 

Y (Integer): 

W (Cardinal): 

H (Cardinal): 

Farbe (Cardinal): 
IDCMP (Long): 

Flags (Long): 

Name (Str): 

Screen (Ptr): 

MinW, MinH (Cardinal): 


x-Koordinate der Fensterposition 
y-Koordinate der Position 
Breite („Width“) 
flöhe („Height“) 

Lo-Byte ist Hinter-, Hi-Byle Vordergrundfarbe 
Signal-Bit-Maske 

z.B. IIOQO für ACnVATE, 8 fürWINDOWCLOSE 
Fenstertitei 

Zeiger auf Screen, „Nil“ für Workbeneh,screen 
Mindestbreite und -hohe 



7. Prozeduren und Funktionen 


161 


MaxW, MaxH (Cardinal): Maximalbrcite und -höhe 

Erraten: Open_Window ölTnet ein Fenster. Wieder entsprechen die einzelnen Parameter den 
Feldern der NewWindow-Struktur, wie zuvor bricht das biufzeitsystem ab, falls das Fenster nicht 
geöffnet werden konnte, und abermals werden die Fenster am Programmende automatisch 
geschlossen, 

„FirstGadget“, „Checkmark“ und „BitMap“ werden jeweils auf Nil gesetzt, „t>'pe“ je nach Sachlage auf 
1 oder 15. 

Close_Window (p) 

p: Ptr 

Dies ist das Gegenteil mn „Open_Window‘': ein Fenster ward geschlossen. 


Free_Mera (Adr,Len) 

Adr (Longlnt): Speicheradresse 

Len (Longlnt): Länge in Bytes 

Dies ist das Gegenstück zu AllocJ/km-, ein reservierter Speicherbereich wird wieder freigegeben. 


Open_Screen(X, Y ,W, H, Depth, BackPen, DetailPen, \^ewmodes, 
Name): Ptr 

X (Integer): x-Koordinate der Position 

Y (Integer): y-Koordinate der Position 

W (Cardinal): Breite („Width“) des Screens 

H (Cardinal): Höhe („Height“) 

Depth (Integer): Anzahl der Bit[)lanes („Tiefe“) 

BackPen (Bv'te): Hintergrundfarhe 

DetailPen (Byte): Vordergrimdfaiite 

ViewModes (Wörd): Flags (z.B. 4 für Inteiiace, I8ÜÜ0 für Hires) 

Name (str): Titel 


Diese Funktion eröffnet einen Screen, Die einzelnen Parameter sind identisch mit den entsprechen¬ 
den Feldern in der NewScreen-Struktur. 


Als „Type“ wird .stets 15 (Custom-screen) angenommen, „TcxtAttr“, „Gadgets" und „CustomBitMap“ 
werden auf Nil gesetzt. Konnte der Screen nicht geöffnet werden, bricht das Programm mit einer 
Fehleirneldung ab. MaxonPASC.AL „merkt“ sich, welche Screens mit dieser Funktion geöffnet wer¬ 
den, und schließt sie ggf. am Programmende wieder automatisch. 



MaxonPASCAL 


162 


CloseScreen (p) 

p: Ptr 

Dreimal dürfen Sie raten... Richtig! Screen schließen! 

OpenConsole (p): Ptr 

p (Ptr): Windowhandle 

Diese Funktion eröffnet zu einem Window das Console.devicc. Zurück- gegeben wird eine ■'Ut 
Devicehandle. Dieser Pointer zeigt (abgesehen vom Offset 16 bzw. 64) auf den Read- bzw. 
Writerephport. 

ReadCon (p): Char 

p (Ptr): ConsoleHatidle (wird von „OpenConsole“ zurückgegeben) 

Liest vom Console.device ein Zeichen. Wurde kein Zeichen eingegeben, ist das Ergebnis cbr(O). 
Beachten Sie aber bitte, daß viele Tasten des AMIGA-Keyboards eine ganze Folge von Zeichen lie¬ 
fern, die Sie dann nacheinander lesen müssen. 


WriteCon (p,String) 

p (ptr): Consolehandle 

String (str): Zeichenkette 

Das Console-device „p“ (erinnern Sie .sich noch? Diesen Zeiger erhalten Sie von der OpenConsole- 
Funktion) wird beauftragt, eine Zeichenfolge im zugehörigen Window auszugeben. 


CloseConsole (p) 

p: Ptr 

Diese Prozedur schließt ein Console-Device, das mit „OpenConsole“ geöffnet worden war. 

SetStdIO (p) 

p: Ptr 

Die Standard-Ein-/Ausgabe wird auf das Console-Device mit der Handle „p“ umgeleitet. Dadurch 
können Sie auf ein mit „Open_Window“ geöffnetes Fenster mit den normalen E/A-Prozeduren 
(Read, Write, ClrScr...) zugreifen. 


SetStdlO(NU) 

Aktiviert wieder die normale Standard-E/A. 



7. Prozeduren und Funktionen 


163 


Im Handbuch zu KickPascal 1.0 wurde empfohlen, beim Programmstart von der Workbench mittels 

Resettlnput, 'CON:...'); Output:» Input; 

Kanäle für die Standard-E/A zu definieren. Dies ist bei Version 3.0 aus Kompatibilitätsgründen wei¬ 
terhin möglich. Es ist aber „sauberer“, obige Befehlsfolge durch 

Win:= Open_Window (...); 

Con:= OpenConsole (Win); 

SetStdIO (Con) 

ZU ersetzen. 

OpenLib (var,name,version) 

var; Pointer-Variable 

name (Str): Name der Librar>' 

Version (Longlnt): Versionsnummer 

Diese Prozedur entspricht der Exec-Funktion „OpenLihrary". Die Unterschiede; 

na- Der Befehl ist nicht als Funktion, .sondern als Prozedur realisiert. Die Basisadresse der Library 
wird dann mittels VAR-Parmeter zurückgegeben. 

Kann die Library nicht geöffnet werden, wird mit einer entsprechenden Fehlermeldung abge- 
brcKhen. 

«ar \Xdc inzwischen schon fast gew'ohnt, wird die Bibliothek am Ende ordnungsgemälä wieder 
geschlossen. 


CloseLib(p) 

p (Ptr): Zeiger auf Libraiy' 

W Eigentlich ist dieser Befehl überflüssig, denn, wie oben erwähnt, werden Libran's automatisch 
geschlossen. Trotzdem wurde er der Vollständigkeit halber implementiert. 


Wait_Port(p); Ptr 

p (Ptr); Zeiger auf Message-Port 

Entspricht der Exec-Funktion „WaitPort". 

Wait(Mask): long 

Mask (Ixinglnt): Signalmaske 

Ist absolut identisch mit der gleichnamigen Fatec-Funktion. 



MaxonPASCAL 


164 


Get_Msg(p): Ptr 

p (ptr): Zeiger auf Message-Port 

Ist identisch mit der Exec-Funktion „GetMsg“. 

Reply_Msg(p) 

p(Ptr): Zeiger auf Message 

Identisch mit der Exec-Funktion „ReplyMsg“. 


7.6 Nützliche MaxonPASCAL-Spezialitäten 

Break (mask); integer 


mask: Bitmaske mit 4 Bits: Bit 

Wert 

Bedeutung 

0 

1 

CtrI-C 

1 

2 

CtrI-D 

2 

4 

CtrI-E 

3 

8 

CtrI-F 

MaxonP.ASCAL bietet Ihnen die Möglichkeit, Programme 

mit der Taste FlO abzubrcchen. Das ist 

aber nicht sehr sauber: Das Laufeeitsystem fragt hier, um nicht mehr Zeit, als unbedingt nötig zu 
verlieren, direkt die Tastatur ab.Deshalb wird überhaupt nicht getestet, in welchem Fenster die 


Faste gedrückt wurde, so dai^ man damit eventuell mehrere Tasks gleichzeitig unterbricht. Aus die¬ 
sem Grund ist diese Möglichkeit eher als Paniktaste während der Programmentwicklung gedacht - 
einem Anw'ender sollten Sie ein solches Programm nicht zumuten. 

Langer Rede schwacher Sinn: Mit der Funktion „Break“ können Sie die Tastenkombinatinnen C 
und ^ D abtragen (und auch noch ^ E und F - alaer es ist nicht üblich, diese Tasten zu benut¬ 
zen). Die Function „Break“ gibt „true" zurück, wenn eine der in der Bitmaske enthaltenen Taste 
gedrückt wurde, An geeigneten Stellen Ihres Programms sollten Sie die C-Taste abfragen („IF bre- 
ak(l) TUEN...“) und dann kontrolliert (geöffnete Dateien scbließen, reservierten Speicher freige¬ 
ben...) das Programm beenden. Spätestens wenn Sie eine lauffähige Objektdatei abspeichern, soll- 
teti Sic die „Unterbrechen“- Option des Compilers au.sschalten. 



7. Prozeduren und Funktionen 


165 


CBreak 

Testet, ob die T'astenkoinbination <Ctrl> + <C> gedrückt wurde, und bricht in diesem Fall mit 
der Meldung „BREAK" ab. Es entspiicht damit der Anweisung „ IF break(l) TUEN error('BREAK’) „ 
und kann immer dann verwendet werden, wenn ein unkontrolliertes Abbrechen des Programms 
nicht schadet. 

Nähere Erläuterungen zum Sinn tiieses Befehls finden Sie bei der Beschreibung der Function 
„Break(n)‘'. 


FreeStack; Longint 

Gibt an, wie viele Bytes noch auf dem Stack frei sind. Man kann die.se Funktion in rekursiven 
Programmen verwentlen, um selbst Stacküberlätife abzufangen, sobald der Platz knapp w'ird. 

Ein anderes Beispiel; Ein Programm mit großen Datenmengen. 

Program Monstrum; 

Procedure Main; { das eigentliche Hauptprograinin } 

Var a: Array[1..100000] o£ Real; 

{ benötigt 4*100000 Bytes } 

Begin 

{ hier steht das Programm } 

End; 

Begin 

If FreeStack<410000 Then { 400 KB für Array, 10 KB Reserve } 
Writelnt'Zu wenig Stack, Babel') 

Else 

Main 

End. 

Das Programm benötigt ein 400 KByte großes Array. Um eine luufzeit- Fehlermeldung zu vermei- 
tlen, |trüft das Hauptprogramm, ob genug Stack zur Verfügung stellt. Nur falls dem so ist, wird die 
Prozetlur „Main“ aufgerufen, in der das Riesenarray lokal deklariert ist. 


Random: Real 

Eiefert eine Zufallszahl mit 0 <= Random < 1. Der Zufallszahlengenerator tenutzt ein 
Standardverfahren; zusätzJicIi wird aber auch die momentane Rasterposititin des Bildschimi- 
Elekronenstrahls in die Redimmg aufgenommen, so daß die Folge richtig schön chaotisch wird. 



MaxonPASCAL 


166 


Random (n): Integer 

n: Integer 

Liefert eine ganzzahlige Zufallszahl im Bereich von 0 bis n-1. 


Randomize 

Die Zufallszahlenfolge wird mit der momentanen Systemzeit initialisien. Da in die Berechnung der 
Zufellszahlen sowieso ein nicht-mathematisches Element eingeht (s. o.), ist diese Prozedur bedeu¬ 
tungslos und wurde nur aus Kompatibilitätsgründen implementiert. 


Hi (int): Integer 

int; Integer 

„Hi-Byte“ einer Zahl: entspricht 

Word(int) div 256 

(da hier vorzeichenlos gerechnet wird), ist aber schneller. 

Lo (int): Integer 

int; Integer 

„Lo-Byte“: Niederwertiges Byte, genau wie „int AND $ff‘ 


Upcase (c): Char 

c: Char 

Wandelt den Buchstaben „c“, falls er zu den Kleinbuchstaben gehört, in einen Großbuchstaben. 
Natürlich werden auch Umlaute korrekt gewandelt. Beispiel: 

Var s: String; 

i: integer; 

Begln 

a!='0 zerfretteiter Grunzwanzlingl'; 

For ii=l to Length(s) do write(Upcaee(s[i])) 

End. 

Ergebnis: 

O ZERFRETTELTER QRUNZWANZLINO1 

Swap (int): Integer 

int: Integer 

Vertauscht Hi- und Lo-Byte des Parameters. 



7. PrQ 7 x;duren und Funktionen 


167 


Frac (r): Real 

n Real-Zahl 

Diese Funktion liefert die Nachkommastellen einer Real-Z^hl. 


Beispiel: 

Frac (17.4) = 0.4 

Frac(-0.07) = -0.07 

Frac(le+10) = 0 (außerhalb der Rechengenauigkeit) 

Es gilt: X = Trunefx) -I- Frac(x) , felis x eine Realzahl ist, die im „Longlnf'-Bereich liegt, so daß 
„Trunc" den richtigen Wert liefert. 


Addr (x): LoDglat 

x: Beliebige Variable, Prozedur oder Funktion 

Gibt die Speicheradresse, an der die Variable liegt b^. die Prozedur oder Funktion „x“ beginnt, 
zurück. 

Die Funktion 

Addr(var) 

(„var“ = beliebige Variable) entspricht damit 
Long (* var ) (siehe auch Kapitel „Pointer“). 

PwrlO(i): Real 

i: Integer-Ausdruck, -19 < i < 19 

Diese Funktion liefert die Zehnerpotenz einer ganzen Zahl als Real. Man könnte dies auch ohne wei¬ 
teres durch wiederholtes Multiplizieren erreichen, aber „pwrlO“ holt sich die Werte aus einer 
Wertetabelle und ist damit erstens schneller und zweitens vermeidet man die Fortpflanzung von 
Rundungsfehlern. 

DbPwrlO(i): Double 

i: Integer-Ausdruck, -308 < i < +308 

Dies ist die Entsprechung zu „PwrlO" im Double-Bereich - daher auch das „Db“ am Anfang. 



MaxonPASCAL 


168 


Si2e0f(x): Long 

x: Typbezeichner oder beliebige Variable 

Liefen den Speicherbedarf eines Datentyps bzw. einer Variablen: 

SizeOf(Integer) = 2 

SizeOf(DosBaae) = 4 ("Dosbaae" lat eine Variable dea Typa 
"Ptr", aiehe auch Kapitel IV). 


Delay(n) 

n: Iniegerzahl 

Delay macht - genau wie die gleichnamige DOS-Funktion - eine Pause von n 50stel Sekunden. 

EiTor(string) 

String: Str 

Das Programm steigt mit der angegebenen Fehler- (oder sonstiger) Meldung aus. 


Halt (nummer) 

nummer: integer 

Programmabbruch mit der angegebenen Fehlernummer. 

AddExitServer (proc) 

proc: globale Prozedur ohne Parameterliste 

In einem Multitasking-System wie dem AMIGA Lst es oft wichtig, dal,'S Programme nicht unkontrol¬ 
liert abbrechen, sondern zuerst noch irgendwie „aufräumen“, z. B. Dateien schließen, Speicher frei¬ 
geben usw. Hat man über MaxonPASCAl.-Prüzeduren auf derartige Resourcen zugegriffen (z. B. 
„0[)m_y(indow , „Reset", „Allocjneni“...), werden die entsprechenden Schließ- cxler 
Freigabeprozeduren am Programmende automatisch ausgeführt. Wenn man aber 
Betriebssystemfunktionen direkt aufgerufen, z, B. „MocBümap" (aus der graphics.libraryO eine 
Bitmap reserviert hat, muß man selbst für ein ordentliches Programmende sorgen. 

Natürlich kann man die entsprechenden Anweisungen einfach am Ende des Ilauptprogramms auf- 
rufen. Dann werden sie aber nur bei einem normalen Programmende ausgeführt, nicht beim 
•Abbruch mit einer Fehlermeldung. 

Nun stelle man sich folgendes Szenario vor: ein Programm reserviert sich mittels „AllocBümap“ etli¬ 
che große Bitmaps. Anschließend versucht es ncxth, mittels der MaxonPASCAL-Funktion 
„Openjcreen" einen Screen zu öffnen, beispielsweise in der Absicht, auf den (unsichtbaren) 
Bitplanes Bildei eüier animierten Grafik zu berechnen und sie dann auf den (sichtbaren) Screen zu 
blittcrn. Nun sei das Chip-RAM durch die „AllocBifmap“-k\iin.\k aber schon so voll, daß kein Screen 



7. Prozeduren und Funktionen 


169 


mehr geöfliiet werden kann - das Programm steigt mit der Meldung „Intuition error aus, ohne die 
Bitmajis wieder freizugeben. Ergebnis: das Chii>RAM ist fast voll belegt und kann nur mit einem 
Reset des Systems wieder freigegeben werden. 

Hier hilft die Piaiedur „AddHxilServer“: Mit ihr kann man Prozeduren angeben, die beim wie auch 
immer gearteten Ende eines Programms ausgeführt werden sollen. Durch wiederholten Aufruf von 
MidExilServer“ können beliebig viele solcher Exit-Prozeduren gewählt werden, die dann am 
Programmende in umgekehrter Reihenfolge ausgeführt werden. Die Prozeduren müssen global 
(also nicht lokal innerhalb einer anderen Prozedur oder Funktion definiert) sein und dürfen keine 
Parameter besitzen. 


PROGRAM Exitus; 

PROCEDURE Ausstieg; 

BEGIN 

Writeln('ExitServer ausgeführt.') 

END; 

BEGIN 

AddExitServer(Ausstieg); 

Writelnt'Division durch 0: 1/0); 

Writelnt'Diese Zeile wird nie ausgegeben.') 

END. 

Das Programm eraeugt folgende Ausgabe: 

Division durch 0: <- "normale" Ausgabe des Programms 

Division by zero. <- Fehlermeldung des Laufzeitsystems 

ExitServer ausgeführt. <- Ausgabe des ExitServers 

Bei jedem Aufruf der Funktionen „OpmJVimkMH“, „üpenjereen“ und „OpenCatisole“ und 
„Openüh“ installiert das PASCAL-üiufzeitsystem im Prinzip nichts anderes als eine Exitseo'er- 
Prozedur, die die jeweilige Resource schließt. Wenn Sie also in Ihrem Programm zuerst einen 
Exitsen'cr installieren und dann ein Window offnen, wird am Ende des Programms erst (Aufruf der 
ExitServer in umgekehi ter Reihenfolge!) ilas Fenster geschlossen und dann erst Ihre Exit-Prozedur 
aufgerufen, Sie können dann z. B. keine Ausgaben in das Fenster mehr machen. 

Mit „New“ oder „Mlocjlem“ re.servierter Speicher wird dagegen erst nach der Abarbeitung aller 
ExitServer freigegeben (falls nicht schon geschehen), und noch geöffnete Dateien werden erst dann 
geschlossen. 


Exil 

Diese Prozedur verläl^t den aktuellen Block. Wenn EXIT im Hauptprogramm aufgerufen wird, ent¬ 
spricht es einem GÜTO-Spnmg ans Programmende, in einer Prozetiur oder Funktion entsprechend 
einem Sprung an deren Ende. 



MaxonPASCAL 


170 


Beispiel: 

PROGRAM Nanu; 

PROCEDURE p; 

BEGIN 

Writeln('PI'); 

Exlt; 

Wrlteln('P2■) 

END; 

BEGIN 

Wrlteln(•Start'); 

PI 

Writeln('Mitte'); 

Exlt; 

Writeln('Ende.■) 

END. 

Das Programm erzeugt die Ausgabe: 

Start 

PI 

Mitte 

Exchange (varl, var2) 

varl,var2: Variablen 

Vertauscht den Inhalt zweier Variablen. Die Variablen müssen skalar sein, d.h. numerisch, Bool, 
Char, Aufzählungs- und Pointertypen. 

Ferner müssen die Typen der Variablen kompatibel sein, insbesondere dieselbe Länge haben. 
Beispiel: 

Var a, b: integer; 

Begln 

a:=26731; b:=4711; 

Exchange(a,b); 

'write(a:8, b!8) 

End. 

gibt aus: 

4711 26731 

Inc (v) 

v: Variable eines geordneten Typs (z. B. Ganzzahl, Char...) 

Der Wert der Variablen „v“ wird um 1 erhöht. Die Anweisung entspricht damit 

v:= Suco(v), 



7. Prozeduren und Funktionen 


171 


Allerdings findet bei „Inc" keine Prüfung auf arithmetischen Überlauf oder Bereichsüberschreitung 
statt. 

Beispiele: 

{ Variablendeklaration: VAR o: Char; i: integer; b: Byte ) 

c:= 'X'; Inc(c); Write(c) gibt aue: Y 

i:= 7 ; inc(i); Write(i) gibt aus: 8 

b:= 255; Inc(b); Write(b) gibt aus: 0 (Überlauf!) 

Dec (v) 

V: Variable eines geordneten Typs (z. B. Ganzzahl, Char,..) 

Dies ist das genaue Geggenteil von ,,lnc": die Variable wird, ohne Bereichsunterschreitung oder 
Unterlauf abzufangen, um einen Wert ernietlrigt. 


7.7 Stringbehandlung 

Concat(stringl, string2,String 

Diese Funktion hängt beliebig viele Strings zusammen und gibt das Ergebnis als temporären String 
zurück. Diese Funktion ist im Prinzip überflüssig, da man Strings auch mit „+“ aneinander hängen 
kann. 

Copy(string, pos, len): String 

String Stringausdruck 

pos: ganzzahlige Konstante 

len: Lange (nicht-negativ) 

Uefert den „len" Zeichen langen Ausschnitt aus „String" ab Position „pos“. 


wrltelii(Copy<’O zerfretteiter Grunzwanzling', 6,7) ) 

gibt „frettel“ aus. Das Ergebnis ist übrigens stets ein temporärer String, 
Falls „len“ negativ ist, wird ein Fehler gemeldet. 


Pos (stringl, string2): integer 

stringl, stringZ: Stringvariablen oder -konstante (keine temporären Strings!) 

Diese Funktion sucht, ob der erste String im zweiten vorkommt, und liefert die Anfangsposition. 



MaxonPASCAI. 


172 


Beispiele: 

Pob(' a' ,'Hallo') = 2 

Pos('ini' , 'Du mich auchl') = 4 

PoaCha' , 'Hallo hallo') = 7, denn Groß-/Kleinschreibung wird 

beachtet 

Pos('' , 'Yxlegrümpf') = 1 

PoB('Himpel','ForeverI') = o, denn "Himpel" kommt in "foreverl" 
nicht vor. 


StrLen(Striiig): integer 

String; Zeichenkettc {String|n|, Str, Stringkonstantc, Char...) 

Ermittelt die Länge des übergebenen Strings (also die Anzahl der Zeichen vor dem ersten Null- 
Char). 


Length (String): integer 

Ist identisch mit „Strim“. 


Insert (string, stringvar, pos) 

String: String-Ausdimek 

stringvar: Variable eines STRlNG|n)-Typs 

pos: ganzzahlige Position, pos > = J 

ln eine Stringvariable wird an einer bestimmten Stelle ein Stringausdruek eingefügt. Falls die 
Position nicht po.sitiv ist, außerhalb der bisherigen Stringlänge liegt oder falls das Ergebnis zu lang 
für die Stringvariable ist, wird ein Fehler gemeldet. 

Beispiel: 

VAR Bt, name: STRING; 

BEGIN 

Bt:= 'Hallo!'; 

Wrlte ('Name: '); ReadLn (Name); 

Inaert (' '+Name, st, 6); 

Writeln (Bt) 

END. 

Dieses Programm fügt den eingegebenen Namen und ein kerzeichen vor dem „!“ in die Variable 
„st" ein und gibt dann also „Hallo...!" aus. 

Delete (stringvar, pos, len) 

stringvar; Variable eines STRING-Typs 
pos: ganzzahlige Position, pos > = 1 

len: ganzÄihlige Hinge, len > = ü 



7. Prozeduren und Funktionen 


173 


Aus einer Zeiclienkette werden ab einer bestimmten Postion eine bestimmte Anzahl von Zeichen 


VAR Bt: STRING; 

BEGIN 

Bt:= 'AMIGOXYA'; 

Delete (at, 5, 3); 

WriteLn (st) 

END. 

ln diesem Programm werden die Buchstaben „OXV" aus dem Stting gelöscht. 
Ergebnis: 

AMI GA 


RealStr( float, digits): String 

tloat: Real-Ausdruck 

digits: Stellenanzahl (ganzzahlig) 

Wandelt die Real-Zahl in eine Zeichenkette imtl gibt diese zurück, und zwar exakt die Zeichenfolge, 
die mit „Write(lloat:0:digits)“ ausgegeben würtle. Näheres zur Bedeutung des zweiten Parameters 
steht im Kapitel über die Numerischen Datentypen, Die Zeichenkette, die „RealStr" zuruckgibt, ist 
temporär (siehe auch Kapitel „Siringtypen"). 


IntStr (i): tempString 

i; Longlnt-Ausdruck 

Aus dem Ganzzahl-Ausdruck wird die entsprechende Dezimalzahl erz.eugt und als temporärer String 
zuriickgegeben. 

Beispiel: 


InsStr(17) 


ergibt 


• 17 ' . 



MaxonPASCAL 


174 


Val (String, numvar, intvar) 

String: String-Ausdruck 

numvar: Variable des Typs Real, Integer oder lx)nglnt 
intvar: Variable des Typ.s Integer oder Cardinal/Word 

Diese Prozedur versucht, den Stringausdruck „string“ in eine Zahl zu wandeln, und zwar abhängig 
vom Typ der Variablen „numvar" in eine Real-, Double-, Integer- oder Longlnt-Zahl. Ist der String 
eine korrekte dezimale Zahldarstellung (ohne führende oder folgende Leerzeichen!), so erhält 
„numvar“ den entsprechenden Zahlenwert und „intvar“ den Wert 0. Falls der String nicht korrekt 
gewandelt werden konnte, ist „numvar“ Undefiniert und „intvar" enthält die Nummer des ersten 
Zeichens des Strings, das nicht paßt. 

Beispiele: 

Var R:Real; LrLong; I,p:Integer; 

ValCdVll', R, p) 

Val('-5', L, p) 

Val('50000‘, I, p) 

Val('+3.14149', L, p) 


==> R=4.711E+4, p= 0 
==> L=-5, p=0 
==> l=undef., p=6 
==> L=undef., p .3 


(weil 50000 > MaxInt) 
(tceino ganze Zahl) 



8, Compiier-Anweisunsen 


175 


8. Compiler-Anweisungen, Includefiles und 
Betriebsystemfunktionen ___ 

8.1 Compiler Directives 

8.1.1 Includefiles 

Es gibt in PASCAL eine Klasse von Anweisungen, die nicht zum Programm gehören, sondern zur 
Steuerung des Compilers bestimmt sind. Sie sind leider nicht genormt. Es ist aber üblich, sie als 
Kommentare zu tarnen: 

{$Anweisung} oder (*$Anweisung*) 

Wie Sie sehen, sind diese Compiler Directives äuiSerlich nichts anderes als Kommentare, deren 
erstes Zcichen'ein J" ist. Der Compiler wird dadurch angewiesen, diesen Kommentar nicht etwa 
wie gewohnt zu überlc.sen, sondern die darin enthaltene Anweisung sofort auszuführen. 

.Aber gehen wir doch von der 'Pheorie gleich zum ersten Beispiel: 

{$lncl "Dateiname" } 

Diese Sequenz weist den Compiler an, eine Includedatei einzuladen. 

„Was ist das?“ 

Es ist nicht immer sinnvoll, den gesamten Quelltext im Editor zu haben. Wenn Sie z.B. einige 
Prozeduren bereits fertiggestellt haben, können Sie diese in einer Textdatei ablegen und aus Ihrem 
Programm löschen, wodurch dieses kürzer und handlicher wird. Im Rest Ihres Programms weisen 
Sie den Compiler an der Stelle, wo vorher der ausgelagerte Teil gestanden hat, mit einer Directive 
an, diesen Teil als Includedatei zu laden. Er tut dann so, als würde der Inhalt der Datei an dieser 
Stelle im Quelltext stehen, und compiliert so, als wäre nichts geschehen. 

Zur Programmierung des Betriebs,Systems stehen Ihnen einige fertige Hilfsdateien zur Verfügung, 
die Sie auf diese Weise in Ihr Programm übernehmen können. Doch dazu später mehr. 

Alles, was hinter einer Directive steht, wird wie ein gewöhnlicher Kommentar überle.sen: 

{$incl''Hallo'' Diese Anweisung öffnet die Includedatei "Hallo" } 

Sie können aber auch mehrere Directives hintereinander hängen, indem Sie sie mit einem 
Semikolon trennen bzw. verbinden (kommt auf den Standpunkt an): 

t$incl "Hallo";Incl"Horrido“ ; include"Hallali" } 

Wie Sie hier ebenfalls sehen, dürfen Sie statt „incl“ auch „include“ oder irgendetwas anderes schrei¬ 
ben - vorau,sgesetzt, es fängt mit „incl“ an. Fenier zeigt obiges Beispiel, daß die Groß- und 
Kleinschreibung bzw. das Einschieben von Leerzeichen dem Compiler egal sind. 



iMaxonPASCAL 


176 


Dieselbe Wirkung wie oben hätten Sie übrigens aucli einfaciier haben können: 

($incl "Hallo”,"Horrido","Hallall") 

Die Sache hat aUerdings noch einen Haken: die Dateien werden aus dem aktuellen Vereeichnis gela¬ 
den. Sie hätten natürlich auch einen ganzen Pfad angeben können, z, B. so: 

{$incl "PASCAL :Includedateien/Gruß/Hallo" ) 

Wenn Sie aber mehrere solcher Dateien einladen wollen, wird es lang und umständlich. Zudem 
mulsten Sie, wenn das Verzeichnis einmal wechselt (z. B. weil Sie auf der Diskette autgeräumi oder 
sie umbenannt haben), alle Dateinamen ändern. Dagegen hilft eine andere Directive- PATH Unser 
Beispiel sähe dann so aus: 

{$path"PASCAL:Includedateien/Gruß/", incl"Hallo","Horrido",Hallall") 

Dieses „path" gibt also einen alternativen Pfad an, üIkt den Indudedateien gesucht werden. 
MaxonPascal sucht Indudedateien immer zuerst im aktuellen Verzeichnis und tiann über diesen 
Pfad. Die Directive „$[)ath" ist aber ziemlich überllüssig, denn man kann den Suchpfad fürincludes 
auch über den Compiler-Requester einslellen. Default ist „piiscahindude“. 

Übrigens: Sie können Indudedateien auch verschachteln, d.h. eine Datei kann selbst wieder andere 
einladen. 

Nun gibt es noch ein weiteres Problem: Der Compiler ist zu schnell! Er ist so unverschämt schnell 
daß die Floppy beim Compilieren von Includefiles nicht miikommt und der Compiler auf sie warten 
muls. Das ist natürlich Zeitverschwendung - zwar eine, mit der man leben kann, aber trotzdem 
ärgerlich. Deshalb gibt es bei der „Path“-Directive eine besondere Ojition: Sie können zwei verschie¬ 
dene Pfade, durch ein Komma getrennt, angeben, z. B. so: 

{$path "ram:include","Pascal:include" } 

Die Viärkung ist folgende: Bei „incl“ wird die Datei zuerst im ersten Veraeichnis (hier: „raiminclu- 
de/“) gesucht. Ist sie dort vorhanden, wird sie auch von dort gele.sen. Falls dem aber nicht so ist 
holt der Compiler die Includedatei über den zweiten Pfad. Und jetz.t kommt der raffinierte Trick: Sie 
wird nicht nur einfach gelesen, sondern gleichzeitig in das ernte Veizeichnis kopiert, so daß sie beim 
nächsten Compilerlauf dort zur Verfügung steht! Auf diese Weise können Sie sich ganz einfach und 
automatisch die Dateien, die Sie benötigen, von der langsamen Diskette in die schnelle RA,M- cxler 
R.AD-Disk kopieren... 

Und es wird noch schöner: Beim Kopieren legt MaxonPASCAL liei Bedarf von selbst die 
Untert'erzeichnisse an, .sofern sie noch nicht existieren! Im obigen Fall würde also immer zuerst 
geprüft, ob lias Directory „raniinclude" bereits existiert. Zu diesem Thema noch ein Beispiel: 

{$path "ram:include/","pascal:include/"} 

{$incl "exec/tasks.h","exec/ports.h","devlcee/trackdisk.h"} 



8. Compiler-Anweisunsen 


177 


liier werden drei der AMIGA-System-Includedateien eingeladen. Beim ersten Compileiiauf, wenn 
die Ramdisk noch leer ist, liest MaxonPASCAL die Dateien aus dem Vei-zcichnis „PASCAl,:include“, 
legt in licr Ramdisk mehrere verschachtelte Unterv'erzeichnisse an (erst „include“ und dann darin 
die Unter-Unter-Directories „exec“ und „devices“) und kopiert die vier Dateien dahin. Bei allen fol¬ 
genden Compilierungen kann MaxonPASCAJ. dann wesentlich schneller auf die Includefiles xugrei¬ 
fen, so daß sie jeweils in Bruchteilen einer Sekunde übersetzt werden. 


8.1.2 Bedingte Compilierung 

Weitere Directives sind IF, FiLSE und ENDIF. Sie erlauben Ihnen, den Compiler zu steuern. Hinter 
der IF-Directive ist eine Bedingung anzugeben, evtl, mit vorangestlltem „not“, ln der vorliegenden 
Version ist aber erst eine einzige derartige Bedingung implementiert; „DEF ident". Diese Bedingung 
ist wahr genau dann, wenn der dalünter angegebene Bezeichner definiert ist. 

Ein Beis|)iel: 

Program ConvpilerDirectives; 

Const Deutsch=26731f { Löschen, wenn Englisch erwünscht } 

Begln 

t$if def deutsch} 
writelnt'Hallo') ; 

{$else} 

writelnt'Hello') ; 

{$endif} 

{$if def yxlegrümpf} 

Dieses hier wird immer überlesen. 

{$endif} 

End. 

Auf diese Weise können Sie Ihr Programm in zwei Sprachen gleichzeitig schreiben. Je nach dem, ob 
die Konstante (Sie könnten aber auch eine Variable, einen Typen, eine Prozedur... nehmen) 
„Deutsch“ deliniert ist, erfolgt eine deutsch- oder englischsprachige Ausgabe. Beachten Sie aber den 
gewaltigen Unterschied zur gewöhnlichen IF-Then-Else-PASCAL-Stiiiktur: Dabei falli die 
Entscheidung während der Laufzeit des Programms, hier schon während des Compilierens. Ferner 
wird hier das, was ausgeschlossen wird, vom Compiler völlig ignoriert, so daß es nicht einmal .syn¬ 
taktisch richtig sein muß. 

Eine weitere Anwendung finden Sie in tlen meisten der mitgelieferten Includefiles. Unter diesen 
Dateien herrscht eine gewisse Hierarchie: einige Irenötigen selbst wieder andere Indudedateien, 
um vom Compiler verstanden zu werden. Bevor diese anderen Includes eingeladen werden, muß 
aber geprüft werden, ob der Compiler sie nicht vielleicht schon längst geladen hat, denn sonst wür¬ 
de es zu Fehlermeldungen wegen Doppeldeklarierungen kommen. Deshalb enthält z. B. die Datei 
„exec/devices.h“ diese Zeilen: 

{$if not def EXEC_DEVICES_H } 

Const EXEC_DEVICES_H=0; 

{$lf not def EXEC_LIBRAHIES_H; incl"exec/librarles.h";endif} 


MaxonPASCAL 


178 


{$if not def EXEC__PORTS_H; lnol"exec/ports.h“;endif} 

...Hier kommt der eigentliche Inhalt der Datei... 

{$endi£} 

Um die ganze Datei legt sich hier eine IF-ENDIF-Klammer, die sichert, daß diese Datei wirklich nur 
einmal vom Compiler übersetzt wird. Um dies feststellen zu können, wird innerhalb dieser 
Konstruktion eine Konstante namens „exec_devices_h“ definiert. Ferner benutzt die Datei 
Bezeichner, die in den Dateien „exec/libraries.h“ und „exec/ports.h“ deklariert werden. Auch diese 
Dateien deklarieren Bezeichner, die wie die jeweilige Datei heißen. Damit kann der Compiler prü¬ 
fen, ob er diese Dateien schon übersetzt hat, und sie nur dann öffnen, wenn dies nicht längst 
geschehen ist. 


8.1.3 Error 

MaxonPASCAL hat noch einige weitere Directives auf Lager, z. B. „Error“. Damit können Sie sich 
individuelle Fehlermeldungen ausgeben lassen. 

Eine denkbare Anwendung wäre z.B., wenn zwei Includedateien sich gegenseitig ausschließen, weil 
es zu Doppeldeklarierungen kommen würde. Ein Beispiel: Sie wollen ein Programm sowohl in einer 
deutsch- als auch in einer englischsprachigen Version schreiben. Dazu deklarieren Sie alle Texte in 
zwei verschiedenen Dateien als String-Konstanten. Die Datei „Deutsch.texte“ könnte dann etwa so 
aussehen: 

{$if def Engliach_texte; 

Error "Sie können nur eine Sprache verwenden”; 
eise } 

Const 

Deutsch_texte= 0; 

Gruß = 'Guten Tag!'; 

Abschied = 'Auf Wiedersehen!'; 

{$endlf} 

„Englisch.texte“ wäre dann genau anders ‘rum: 

{$if def Deutsch_texte; 

Error"Sie können nur eine Sprache verwenden"; 
eise } 

Const 

Engllsch_texte= 0; 

Gruß = 'Hello!'; 

Abschied - 'Bye!'; 

($endl£} 

Bei zwei so einfachen Includedateien ist es natürlich kein Problem, auch ohne derartige 
Fehlermeldungen die Übersicht zu behalten. Wenn Sie aber einen ganzen Haufen ineinander ver¬ 
schachtelter Dateien anlegen, kann dies recht nützlich werden. Denn wenn in einer Includedatei ein 



8. Compiler-Anweisungen 


179 


Fehler auftritt, setzt der Compiler den Editor- Cursor nicht etwa auf die fehlerhafte Stelle (die ja gar 
nicht im Arbeitsspeicher, sondern in einer Datei liegt), sondern auf die zugehörige „incl“- 
Anweisung. 


8 , 1.4 Linkersteuerung 

Mit der Compiler-Anweisung 

{$link "dateil", "dateiZ", ... , "dateix" ) 

wird der Linker angewiesen, die angegebenen Dateien zu laden und zum compilierten Programm 
hinzuzulinken. Die Dateien werden, wenn der Compiler auf diese Directive stößt, sofort geladen; 
gelinkt wird aber erst nach dem erfolgreichen Compile-Vorgang. 

Die Directive darf, wie alle anderen auch, an jeder Stelle des Quelltextes stehen. 

Im Gegensatz zu „incl“ gibt es zu „link“ keine Pfad-.Anweisung und auch keine L'mkopier- 
Möglichkeit. 

Die Directive „ulink“ arbeitet wie „link“, holt die Datei aber aus dem in der Config-Datei angegebe¬ 
nen Unit-Verzeichnis. Im Make-Modus werden "flink" und "funlink" grundsätzlich ignorien, da hier 
die Projektverwaltung für das Linken verantwortlich ist. Alles weitere zu dieser Directive finden Sie 
im Kapitel 9 „Units und Module“. 


8.1.5 Compiler-Optionen 

Mit dem Pull-Down-Untermenü „OptJonen/Compiler“ können Sie einige Compiler-Optionen ein¬ 
stellen. Der Nachteil: Diese Einstellungen wirken nur global, gelten also für das gesamte Programm, 
und es geht nicht aus dem Quelltext hervor, welche Einstellung sinnvoll ist, so daß man immer, 
wenn man einen Quelltext in den Editor lädt, die Optionen von Hand einstellen muß. 

Deshalb gibt es eine Compiler-Directive, mit der man diese Einstellungen vornehmen kann. Sie 
heißt 

{$opt paral, para2, ... , paraX ) 


Syntax für einen einzelnen Parameter-. 

((„t« |..b"|"s"l"a") {" + " I "-" I "0")) I "q" 

Die Anfangsbuchstaben der Parameter entsprechen den Tasten im Tastatur-Untermenü 
„Preferences“ und wirken auch .so: 

{$opt q } schaltet alle Optionen aus („Quick") 

{$opt x-r} die Option „x“ (hier ist natürlich „t“, „i“, „b“, „s“ oder „a“ 

einzusetzen) wird eingeschaltet - entspricht „ON“ im Tastaturmenü 
oder einem abgehakten Punkt im Pull-Down-Menü. 
schaltet die Option „x“ aus („x“ wie oben zu ersetzen). 


{$opt X- } 



MaxonPASCAL 


180 


{$opt xO} die entsprechende Option wird auf den Wert geschaltet, der im 

Menü eingestellt ist. Dies ist natürlich nur sinnvoll, wenn die Option 

vorher mit „x+“ oder „x-“ ein- oder ausgeschaltet wurde. 

Beispiele: 

{$opt q,s+} 

schaltet alle Optionen außer dem Abfangen eines Stacküberlaufs aus. 

s: = 0 ; 

{$opt b-,a-} 

FOR 1:=1 to 1000 do 8:= s + a[i]; 

{$opt b0,a0} 

In diesem Programmfragment werden die 1000 Elemente eines Arrays summiert, Um dies zu 
beschleunigen, werden vor der Schleife die Unterbrecliungsmöglichkeit (mit Taste <F10>) und 
die Prüfung auf Überlauf ausgeschaltet. Nach der Schleife vens'endet der Compiler wieder die 
Einstellung des .Menüs. 

Die Optionen gelten also von der Stelle an, w'o die „opt“-Directive steht, bis sie durch eine folgende 
Directive wieder anders ge.setzt werden. Am Anfang, also vor einer „opt“-Directive, verwendet der 
Compiler natürlich wie gewohnt die im Menü eingestellten Optionen, 

Nun aber das Wichtigste: Die Bedeutung der einzelnen Optionen. 


f - Subrange testen 

Bei Wertzuweisungen an als Ausschnitcstyp deklarierte Variablen ist zur laufzeit der Wertebereicb zu 
prüfen. Alter man benutzt Ausschnittsypen ja gerade, um solche Bereichsüberprüfungen durch¬ 
führen zu lassen, so daß man diese - defaultmäßig aktivierte - Option wohl nur ausschalten wird, 
wenn man eine Exe-Datei eines ausgetesteten Programms erzeugen lassen will. 

Bei Zuweisung konstanter Werte wird der Bereich schon zur Compile-Zeit geprüft, und zwar unab¬ 
hängig von der „t“-Option. Das folgende Programm wird also immer eine Compiler-Fehlermeldung 
verursachen: 

Var n: 1..100; 

Begin ii:= 101 End. 

Dagegen findet bei folgendem Programm die Prüfung zur Laufzeit statt, und zwar nur dann, wenn 
die Option „t“ aktiv ist: 

Var n: 1..100; 

Begin 

n:= 100; { im erlaubten Bereich } 

ni= n+1; { Bereichsüberschreitung, erst zur Laufzeit feststellbar } 

End. 


8. Compiler-Anweisunscn 


181 


/ - Indexbereich bei Array-Zugriff 

Diese Option sorgt ilafür, daß bei jedem Zugriff auf ein Array-Element getestet wird, ob der Index im 
richtigen Bereich liegt. Man sollte diese Option nur ausschalten, wenn das Programm wirklich 
durchgetestet und debiiggt ist, denn die Polgen können sonst gleichermaßen fatal (GURU!) wie 
heimtückisch (Fehler schwer zu finden) sein: Zwar liefert ein Lesezugriff auf ein nicht-existentes 
Feldelement nur einen Undefinierten Wert, aber eine derartige Wertzuweisung schreibt einen Wert 
irgendwo in den Speicher. .Meist (jedenfalls bei geringen Abweichungen vom deklarierten 
Indexbereich) liegt an dieser Stelle eine andere Variable, die dann aus scheinbar unerklärlichen 
Gründen einen anderen Wert erhält - vael Spaß bei der Fehlersuche... 

Es kann aber auch passieren, daß Sie das System zerschießen und Ihr .AMIGA wieder ‘mal nach 
Indien pilgert. Also Vorsicht beim Au.sschalten dieser Option! 

Beispiel: 

{$opt i-} 

Var a: Array[1..10] of integer; 

k: integer; 

Begin 
k:= 42; 

a[0]:= 26731; { FALSCHER INDEX!II ) 

writeln(k) 

End. 

Dieses Programm gibt „2673 P‘ aus. 


b - Unterbrechen 

Es ist au.sgesprochcn ärgerlich, wenn ein Programm während eines Probelaufs unaufltaltbar in einer 
Endlos-Schleife hängenbleibt. Zwar kann man dann den Quelltext problemlos speichern, aber man 
muß neu booten, um tias Programm zu stoppen. Deshalb gibt cs eine Taste zum Alibrechen von 
PASC.AL-Programmen - nämlich tlie Punktionstaste <F]0>. Wenn die Option „b“ aktiv ist, baut dei' 
Compiler an geeigneten Stellen Tastaturabfiagen in den Code ein, und zwar überall dort, wo eine 
Endlosschleife entstehen könnte: 

Ȋ' Am .Anfang von WFIILE- und REPEAT-Schleifen 
“äc Bei Labels 

T*' Innerhalb jeder FOR-Schleife (die zwar theoretisch nicht endlos, prakti.sch aber ganz schön 
lang sein kann) 

tw Am Anfang von Unterprogrammen (endlose Rekursion!) 

Lim nicht mehr Zeit als unbedingt nötig zu brauchen, fragt das Programm die Tastatur 
hardwaremäßig ab - auf einem .Multitasking-System gewiß nicht das Gelbe vom Ei, denn stellen Sie 
sich einmal vor, Sie lassen Ihr mit MaxonP.ASCAL entwickeltes Apfelmännchen-Programm im 



MaxonPASCAL 


182 


Hintergrund rechnen, während Sie schon das nächste Programm entwickeln und dabei im 
MaxonPASCAL-Editor mit der Taste <F]0> ans Textende springen... 

Sie sehen also, dalS die Abbruchmöglichkeit mit <F]0> nur als Notausstieg während der 
Programmentwicklung taugt. Wenn Sie ein Programm schreiben, das der Benutzer abbrechen kön¬ 
nen soll, ist es wohl besser, an geeigneten Stellen (zum Beispiel in Schleifen - siehe oben!) mit dem 
„CBreö^“-Befehl oder der Funktion „Breakfl)“ die Tastenkombination „ C“ abzufragen. 

Wenn Sie ein Programm geschrieben haben, das länger rechnen soll (ein paar Minuten, über Nacht 
oder so), ist es oft keine leichte Entscheidung, ob man die Breakpoints setzen soll. Wenn Sie sie 
rauslassen, riskieren Sie, Ihr Programm nur noch durch einen Reset abbrechen zu können. Der 
Laufeeithedarf der Tastenüberprüfung ist unterschiedlich, macht sich aber vor allem bei engen 
Schleifen bemerkbar: Die Laufzeit einer leeren FOR-Schleife steigt dadurch um ca. 75%, wenn die 
Schleife aber nennenswerte Anweisungen enthält, ist der Laufzeitaufwand eher marginal. 

Beispiel: 

VAR L,S:Long; 

BEGIN 

{$opt q,bO) 

S:= 0; 

POR L:=l to 200000 DO S:= S + (L-10000) 

END. 

Bei dieser kleinen Schleife steigt die Laufzeit durch die Abbrechmüglichkeit nur noch um ca. 25%, 
und wenn der Schleifenkörper mehr Anweisungen enthält (dürfte die Regel sein), ist der 
Zeitaufwand für die Tastaturabfrage im Vergleich zu den resdichen „Kosten“ eines einzelnen 
Schleifendurchlaufe lächerlich gering. 


5 - Stacküberlauf abfangen 

Auf dem Stack (Stapelspeicher) werden zur laufzeit die nicht als STATIC deklarierten Variablen 
abgelegt (lesen Sie dazu bitte auch den Abschnitt „dynamische und statische Variablen“ im Kapitel 
„Module“). 

Die Option „s“ sorgt nun dafür, daß dabei stets auch geprüft wird, ob noch genug Speicher frei ist - 
andernfalls nimmt das Programm sich den Speicher einfach, egal, ob 'w'as frei ist oder nicht. 

Auch diese Compiler-Option benötigt etwas (aber nicht viel) Laufzeit. Vor allem (falls überhaupt) 
macht sich die Verzögerung bei rekursiven Prozeduren bemerkbar - aber gerade dort ist sie eigent¬ 
lich unverz.ichtbar, denn der Stackbedarf von Rekursionen läßt sich nur schwer abschätzen und wird 
auch nicht bei „Linear Stack Requirement“ berücksichtigt. 


a - Überlauf bei arithmetischen Operationen melden 

Bei arithmetischen Operationen wird jeweils auf Über- oder Unterlauf geprüft. Dies kostet vor allem 
bei Additionen und Subtraktionen von Integer-Zahlen (aller Längen, versteht sich) Laufzeit. Bei dem 



8. Compiler-Anweisungen 


183 


folgenden Programm erhöht es beispielsweise die Reehenzeit um etwa 25 Prozent. Bei 
Multiplikationen oder .sämtlichen REAl.-Opei'ationen ist der Effekt nicht so gravierend, da diese 
Operationen ohnehin ewig dauern (nach Computer-Maßstäben). 

VAR i,j,k,l.m:integer; 

BEGIN 

{$opt q,aO) 

1 := 0 ; 
m: = 0; 

FOR i;=l TO 50 DO 
FOR j:= 1 TO 50 DO 
FOR k:= 1 TO 100 DO 
BEGIN 

1:= i+j-k 
m:= 1+k 
END; 

END. 

.Achtung; Bei LongReal-Rechnungen kommt es nicht zu einer Fehlermeldung, sondern zu einer 
Fatception, und zwar unabhängig von dem „a“-Compilersw'itch! 


8.1.6 Kurzauswertung boolescher Ausdrücke 

Werten Sie dtK’h einmal den folgenden logischen Ausdruck aus: 

((1 < 0) and (2<3>) or {(l<2)or(l=2)) 

Falls Sie ein wenig Erfahrung mit boolescher Algebra haben, werden Sie gar nicht alle Terme des 
Ausdrucks betrachten, sondern etwa so Vorgehen: Der linke Teil der AND-Verknüpfung ist FALSE, 
also ist das Ergebnis unabhängig von der rechten Seite FALSE. Bei der zweiten OR-Verknüpfung ist 
der erste Term TRUE, also auch das Ergebnis dieses OR. Das Gesamtergebnis des Ausdrucks ist also 
TRUE. 

Sinnvollerweise kann MaxonPASCAL logische Operanden genauso auswenen: Ist der erste Operand 
von AND logisch falsch oder der erste von OR wahr, wird der zweite Operand gar nicht erst betrach¬ 
tet, denn der hat auf das Ergebnis keinen Einlluß mehr. 

MaxonPASCAL 1.0 wertete noch immer beide Operanden aus, bevor es das Ergebnis berechnete. 
Aus Gründen der Kompatibilität gibt es in Version 3 aber einen Umschalter, mit dem man eine Voll- 
Auswertung erzwingen kann. Er wurde in Form einer Compiler- Directive realisien und heißt wahl¬ 
weise 

{$bool full) oder {$bool all). 

Die Einstellung gilt dann, wie gewohnt, von der Stelle an, wo die Directive steht, bis zu der Stelle, 
wo wieder umgeschaltet wird. Das geschieht mit 

{$bool min) oder {$bool fast), 
ganz wie Sie wollen. 



MaxonPASCAI. 


184 


Jetxt Stehen Sie möglicheroeise wieder an der Stelle, wo Sie ausrufem „Was soll das?“, oder vielleicht 
auch; „Cui bono?" Denn da es ja klar ist, dalS die Kurzauswertung Zeit spart, hat man nicht das 
Bedürfnis, in einen langsameren Modus zu schalten. Oder? 

Natürlich h:it es auf das laiufeeitvcrhalten eines Programms keinen Einfluß, ob ein Teilausdruck wie 
„2 <3“ ausgewertet wird oder nicht. 

Allerdings können Sie in booleschen Austlrücken auch Funktionen mit Seiteneffekt betrachten, d. h. 
selbstdefinierte Funktionen, in deren AnweLsungsteil globale Variablen veräntlert w'erden (schreckli¬ 
cher Programmierstil!) oder die Ein- (xier Ausgaben machen. Ein Beispiel für letztere Unart: 

Progreim 

Die_vogoniache_Poesie_ist_die_drittschlechteste_des_Universuins; 

Function Frage: Boolean; 

Var c: Char; 

Begin 

writet'Wollen Sie das Gedicht wirklich lesen? '); readln(c); 

Frage:= (c In [ ■ j ', 'J']) 

End; 

Function Bestätigung: Boolean; 

Var c: Char; 

Begin 

writet'Sind Sie ganz sicher? ■); readln(c); 

Bestätigung:= (c In t'j', ’J']) 

End; 

{$bool full - bewirkt hier fehlerhaften Programmablauf! } 

Begin 

If Frage and Bestätigung Then 

writelnt'Na gut. Sie haben es nicht anders gewollt:' \10\10, 

'O zerfretteiter QrunzwanzlingI’\10, 

'Dein Harngedränge ist für mich'MO, 

'Wie Sohnatterfleck auf Bienenstich.\e'0;33mWü', 

''\e'Büü'\e'Büä'\e'Bä'\e'Bä'\8\e'Bä'\8\e'Br'\8\e'Bg'\8, 

' '\e'B.'\8\e'B.'\8\e'B. ') 

End. 

Jede der beiden Functions fragt den User, oh er sich das Gedicht wirklich antun will, und gibt die 
Antwort als booleschen Wert zurück. 

Normalerweise steigt das Programm aus, wenn die erste Frage nicht mit ,Ja“ beantwortet wird. 
„Bool Full“ bewirkt aber, daß dann trotzdem noch die zweite Frage gestellt und erst dann der 
Ausdruck au.sgewertet wiixl. Natürlich kann man sich auch umgekehrt Programme konstruieren, die 
ausschließlich mit „Bool Full“ korrekt laufen, aber das dürfte in der praktischen Programmierung 
kaum Vorkommen, so daß defaultmäßig Kurzauswertung vorgenommen wirtl. Wenn Sie aber ein 
mit Ma-xunPASCAL entwickeltes Programm portieren wollen, sollten Sie daran denken, daß nicht 
jeder Compiler Kurzauswertung behen'scht - zum Beispiel die Version 1.0 von MaxonPASCAL! 




8. Compiler-Anweisungen 


185 


8.1.7 Behandlung von Ein-ZAusgabefehlern 

Die saubere Programmierung von Ein- und Ausgalieoperationen ist oft eine lästige Angelegenheit, 
denn hier muß das Programm mit einem Benutzer, einem Peripheriegerät oder dergl. kommunizie¬ 
ren, wobei es praktisch immer zu Fehlern kommen kann. Typische Beispiele sind Fehleingaben des 
Benutzers, der Versuch des Lesens einer nicht vorhandenen Datei u.sw. Wenn man ein Programm 
nicht nur selbst benutzen, sondern auch anderen Anwendern zugänglich machen will, muß man bei 
jeder nennenswerten F*A-Operation dafür sorgen, daß crentuell auftretende Fehler nicht zu einem 
Fehlverhalten des Programms führen (OK, bei einfachen Bildschimiausgaben mit Write[Ln] dürften 
in ewa nie Fehler auftreten). 

Der Normalfall ist, daß nach einer EA-Operation die Funktion „lOResult“ eine Fehlernummer <> 0 
liefert, so daß das Programm den Fehler erkennen und in geeigneter Weise darauf reagieren kann. 
Seit Version 2.0 gibt es aber die Möglichkeit, Code erzeugen zu lassen, der bei einem E.A-Fehler mit 
einer Fehlermeldung aussteigt. Das ist zwar zugegebenermaßen nicht die benutzerfreundlichste .\rl 
der Fehlerbehandlung (man hat gerade 1000 Adressen in sein Dateiprogramm eingetipt und dann 
steigt das Ding beim Abspeichern aus...), aber wenigstens w'eiß der Benutzer cLann, das etwas schief¬ 
gelaufen Ist. 

Das funktioniert, wie alles in diesem Kapitel 8.1, über eine Compiler Directive. Sie heißt wahlweise 
„i“ (ist kompatibler) oder „io" (ist aussagekräftiger) und wird von einem „+“ {Fehlerkontrolle ein¬ 
schalten) oder einem (im fttlgenden Fehler ignorieren) gefolgt. 


VAR i, j: integer; 

BEGIN 

Write ('Bitte zwei Zahlen eingeben: '); 

{$io+: ab jetzt bei Fehlern ausateigen } 

Read (1); 

{$io-: ab jetzt Fehler ignorieren ) 

Read (j) ; 

IF lOReault <> 0 THEN 

Write ('Die zweite Eingabe war nicht richtig.'); 

Writeln; 

Write ('Eingabe war: ', i:8, j:a) 

END. 

Bei Eingabe „x 4“ steigt das Programm mit einer Lautzeitfehlermeldung aus, während cs bei Eingabe 
„4 x“ den Fehler erkennt und meldet. 



MaxonPASCAL 


186 


Sie können sich die Funktionsweise der |io-Directive im Prinzip so vorsteUen, als ob hinter jede 
Anweisung, die mit EA zu tun hat, 

IF lOResult <> 0 TUEN Error ('File error'); 
geschrieben würde. 

Folgende Prozeduren werden von $io behandelt: 

CIrScr 

Get 

Page 

Put 

Read 

ReadLN 

Reset 

Rewrite 

Seek 

Write 

WriteLN 

Bei aktivierter $io-Option kann Ihr Programm noch nicht einmal Fehler, die beim Öffnen einer Datei 
auftreten, selbst abfangen. Deshalb ist es nicht sinnvoll, sie für das ganze Programm einzuschalten. 

8.2 Libraries 

Das Betriebssystem des AMIGA ist in mehrere Libraries aufgeteilt. Mit MaxonPASCAL können Sie alle 
diese Funktionen verwenden. Dazu müssen sie aber zuerst deklariert werden. 

Jede Library besitzt eine Basisadresse. Unterhalb dieser Adresse liegt im Speicher stets eine Tabelle 
von Sprungbefehlen, die zu den jeweiligen Libraryfunküonen führen. Die Differenz zwischen der 
Basisadresse der Bibliothek und der Adre.sse des Einsprungs heißt der Offset der Funktion. Diese 
Offsets sind stets negaüv (weil ja die Sprungtabelle, wie gesagt, unterhalb der Basisadresse liegt) 
und ist durch 6 teilbar (weil ein normaler Sprungbefehl in Maschinensprache 6 B^tes belegt). 

Zunächst brauchen Sie also die Basisadresse der Library, die Sie benutzen wollen. Die Basen der 
„exec.library“ und der „dos.library" stehen Ihnen durch die Variablen „SysBase“ und „DosBase“ zur 
Verfügung, bei allen anderen Bibliotheken erhalten Sie die jeweilige Basis mit Hilfe der Prozedur 
„Open_Library“, die bereits im Kapitel „Prozeduren und Funktionen“ erläutert wurde. Diese 
Adresse müssen Sie in irgendeiner Variablen ablegen, die vom Typ „Long"/''LongInt‘' oder einem 
Pointertypen sein kann. 

■Als nächstes sind die einzelnen Funktionen der Library zu definieren. Eine Library-Deklaration kann 
irgendwo im Deklarationsteil des Programms bzw. eines Unterprogramms stehen und hat folgende 
Syntax: 

"Library" Basis {Offset ProcOrFuncHeading I";"]} "End;" 




8. Compiler-Anweisungen 


187 


Als Beispiel betrachten wir einen Teil der „exec.library“, den Sie in dem Includefile „exec/lists.h“ fin¬ 
den. Es beginnt mit dem Kopf: 

Library SysBase: 

Als Basis kann man einen beliebigen Ausdruck verwenden, aber eine einfache Variable ist wohl am 
sinnvollsten. 

Nun folgen die einzelnen Prozeduren und Funktionen. Die erste heißt „Insert" und hat den Offcet - 
234. Da es aber zu einer Kollision mit der gleichnamigen .MaxonPASCAL-Prozedur kommen würde, 
mußte sie umbenannt werden, und zwar in „_Insert“. Das ist möglich, denn die 
Betriebssystemfunktion „weiß" ja überhaupt nichts davon, unter welchem Namen sie aufgerufen 
wurde ■ Hauptsache, der Offset und die Parameter stimmen. 

Also sieht die Deklaration so aus; 

-234: Procedure _Insert(aO!p_LiBt; al,a2: p_Node); 

Der Teil hinter dem ist ein ganz normaler Prozedurkopf Nun weiß der Compiler, daß dieser 
Procedure drei Parameter zu übergeben sind, von denen der erste vom Datentyp „p_List“ und die 
beiden anderen vom Typ „p_Node“ sind (diese beiden Datentypen wurden natürlich zuvor in dem 
Includefile definiert). Nun müs.sen die Parameter aber nicht in irgendwelchen Variablen, sondern in 
Prozessorregistern übergeben werden. 

Der Prozessor 68000 hat die acht Datenregister dO, dl,.. d7 und acht Adressregister („aO“ bis „a7“). 
ln allen diesen Registern können den Betriebssystemfunktionen Parameter übergeben werden - mit 
drei Ausnahmen: „a7“ ist der Stackpointer, in „aö" wird unmittelbar vor dem Aufruf die Basisadresse 
gelegt und .,a5“ hat in MaxonPASCAL eine besondere interne Bedeutung. Diese drei Register dürfen 
also nicht verändert wenlen. 

Zurück zum Beispiel: Es folgen noch sechs Prozeduren und eine Funktion: 

-240:Procedure AddHead(aO:p_Li8t; al:p_Node); 

-246:Procedure AddTail(aO:p_LiBt; al:p_Node); 

-252 rProcedure Hemove{al:p_Node); 

-258:Procedure RemHead(aO:p_LlBt); 

-264 rProcedure RemTail(aO:p_LiBt); 

-270rProcedure Enqueue(aO:p_LiBt; al:p_Node); 

-276rPunction FindName(aO:p_Llst; al:Str):p_Node; 


Man beendet die Library-Deklaration mit: 

End; 


Noch einmal das Ganze im Überblick: 

Library SysBase: 

-234 : Procedure _IiiBert (aO :p_Li8t; al, a2 :p_Node) ; 
-240rProcedure AddHeadtaO:p_Liat; al:p_Node); 
-246:Procedure AddTail(aO:p_List; al:p_Node); 



MaxonPASCAL 


188 


-252:Procedure Remove{al:p_Node)f 
-258:Procedure RemHead(aO:p_List); 

-264:Procedure RemTail(aO:p_Li8t); 

-270:Procedure Enqueue(aO:p_Llst; al:p_Node); 

-276 :Function FindNeune (aO:p_List; al! Str) :p_Node; 

End; 

Aber keine Panik: Natürlich müssen Sie solche Tabellen nicht ständig selbst schreiben - warum soll¬ 
ten Sie das Rad immer wieder neu erfinden? Die Library-Deklarationen finden Sie in den Includefiles 
auf einer Ihrer MaxonPASCAl.-Disketten. Genaueres dazu im nächsten Kapitel. 

Alles, was Sie wissen müssen, ist, daß die Exec- und DOS-Library beim Programmstart immer schon 
geöffnet sind. Bei den anderen Libraries dürfen Sie nie vergessen, sie am Progratnmanfang mit 
„üpenDb“ zu öffnen, denn andernfalls ist Ihnen der Guru sicher (ich habe das auch einmal verges¬ 
sen und bin dann bei der Fehlersuche fast wahnsinnig geworden, weil ich nicht auf die Idee kam, 
mal am Programmanfang nachzusehen). 

8.3 Anmerkungen zu den Include-Files 

Die Include-Dateien enthalten alles, w'as Sie zur Programmierung des AMIGA-Betriebss>'stems 
benötigen: Konstanten, Typen (Strukturen) und Libraries. Sie entsprechen Im wesentlichen den 
nonnalen „C“-Includefiles. Nur hin und wieder mußten die besonderen Gegebenheiten der Sprache 
PASCAL berücksichtigt werden. 

Zuerst w'ären da Kollisionen mit PASCAL-Schliisselwörtem zu erwähnen. Die beiden wichtigsten: 
einige Strukturen (z. B, ..NewScreen“) enthalten ein Feld mit dem Namen „Type“, und in Exec gibt 
es einen Datentypen namens „Library“. Diese Probleme wurden jeweils gelöst, indem diesen 
Bezeichnern ein Uniterstrich vorangestellt wurde („_Library“, „_Type“). Genauso wurden die 
Problemfälle behandelt, die dadurch entstanden, daß PASCAL nicht zwischen Groß- untl 
Kleinschreibung unterscheidet; in „intuition/intuition.h“ gibt es sowohl die Konstante „CI05£WW- 
DOW'' als auch die Prozedur „G/aseW'mz/o«'“ sowie weitere derartige Kollisionen bei „reportmome“ 
und (in „intuition/screens.h“) bei „showtille“. ln derartigen Fällen hat stets eine Prozedur Vorrang 
vor einem Datenttpen und dieser wiederum vor einer Konstanten, was in den genannten Fällen 
konkret heißt, daß tien Konstantennamen stets ein vorangestellt wurde. 

Die dos.librarv' enthält einige Funktionen und Prozeduren, deren Namen mit PASCAL-Bezeichnern 
kollidieren: „Read“, „Write“, „Close“, „Seek“, Jnput“ und „Output“. Diese Funktionen erscheinen in 
den Includefiles jeweils zw'eimal: zum einen, wie gehabt, mit am Anfajig („_\Vrite“), zum ande¬ 
ren mit vorangestelltem „Dos“ (z. B, „DosWrite“). Sie halten also die Wahl, welche Namen Sie benut¬ 
zen wollen. 

Weitere Kollisionen: Der Datentyp „Filehandle“ in der Datei „libraries/dose.xtens.h" wurde in 
„JFilellandle“ umbenannt, und die Funktion „Text“ der graphics.library kann wahlweise als „_Texi" 
oder ulfi „GfxText" autgerufen werden. 


8. Compiler-Anweisungen 


189 


Bei MaxonPASCAL gibt es keine Datei „functions.h" wie in C, vielmehr sind die 
Funktiünsdefinitionen auf verschiedene Intiudeliles verteilt: Die Funktionen der exec.library stellen 
in verschiedenen Dateien, und zwar jeweils da, wt) die zugehörigen Datentypen definiert werden. 
Sie brauchen sich darüber also normalerweise keine Gedanken zu machen. Für die anderen 
Libraries wurden entweder „.Iib“-Files angelegt, in tlenen ihre Funktionen tieklariert werden, oder 
sic wurden anderen Indudefiles ..beigepackt“. 

Hier ist eine Liste aller zur Verfügung stehenden Libraries, ihrer Basisvariablen und der Dateien, in 
denen siedeklariert werden: 


NAME 

BASIS 

DATEI 

amigaguide.library 

AmigaGuideBase 

amigaguide.lib 

asi.library 

AsIBase 

asl.lib 

battclock.library 

BattClockBase 

battclock.lib 

bullet.library 

BulletBase 

bullet.lib 

cardres.library 

CardResource 

cardres.lib 

clist.library 

CListBase 

clist.lib 

colo wheel. library 

ColorWheelBase 

colorwheel.lib 

commodities.library 

CxBase 

Commodities.lib 

console.library 

ConsoleBase 

devices/console.h 

datatypes.library 

DataTypesBase 

datatypes.lib 

disk,library 

DiskBase 

disk.lib 

diskfont.library 

DiskFontBase 

libraries/diskfont.h 

dos.library 

DosBase 

libraries/dos.h 

dtclass.library 

DTClassBase 

dtclass.lib 

exec.library 

SysBase 

exec/#?.h 

expansion.Iibrary 

ExpansionBase 

libraries/expansionbase.h 

gadtools.library 

GadToolsBase 

gadtools.lib 

graphics.library 

GfxBase 

graphics.lib 

icon.library 

IconBase 

workbench/icon.h 

iffparse.library 

IFFParse 

iffparse.lib 

intuition.library 

IntBase 

intuition.lib 

keynnap.library 

KeymapBase 

keymap.lib 

layers.library 

LayersBase 

layers.lib 

Locale.library 

LocaleBase 

locale.lib 

mathieeedoubbas.library 

MathleeeDoubBasBase mathieeedoubbas.li 

mathieeedoubtrans.library 

MathleeeDoubTransBase mathieeedoubtrans. 

misc.library 

MiscBase 

misc.lib 

potgo.library 

PotgoBase 

resources/potgo.h 

rexxsysiib.library 

RexxSysBase 

rexxsysiib.lib 

timer.library 

TimerBase 

devices/timer.h 

translator.library 

TranslatorBase 

libraries/translator.h 

utilitiy.library 

UtilityBase 

Utility.lib 

workbench.library 

WorkbenchBase 

wb.lib 



MaxonPASCAL 


190 


Noch eine Bemerkung zu den zahlreichen Datentypen, die in den Includefiles definiert werden: Zu 
jedem Record-Typen existiert ein Zeigertyp, der den Namen des Record-Typs mit vorangestelltem 
„p_“ trägt, z. B. „Window“ und „p_Window“. Der Grund dafür ist, daß an einigen Stellen 
(Parameterlisten) in PASCAL nur Typbezeichner wie z. B. „p_Window“, aber keine 
Typbeschreibungen (wie „ ^ Window“) erlaubt sind. 



9. Units und Module 


191 


9. Units und Module _ 

9.1 Modulare Programmierung: was, warum und wie? 

MaxonPASCU bietet Ihnen seit Version 2.0 ein Feature, das (wie viele andere nützliche Dinge auch) 
in Standard-PASCAL fehlt: das Konzept der mrxiularen Programmierung. Die Grundidee ist die, dalä 
ein Programm in beliebig viele sog. Module auigeteilt wird, die dann mehr oder weniger unabhängig 
voneinander ediert und compiliert und erst danach zu einem einzigen Programm zusammengebun¬ 
den werden. Das Zu.sammensetzen der Module heißt „linken“. Sicher ist Ihnen bereits die Ausgabe 
,.I.inking...“ am Ende des Compilevorgangs von MaxonPASCAL aufgefallen. 

MaxonPASCAL ruft den integrierten Linker immer automatisch auf, auch dann, wenn es bei einem 
nicht-modularen Programm scheinbar nichts zu linken gibt (gibt es aber doch; das Programm wird 
mit dem P,^SCAL- Laufzeitsystem zusammengebunden). 

Es gibt viele gute Gründe, sein Programm in Module zu zerstückeln: 

■SS- Die einzelnen Quelltexte w'erden kürzer. Da man immer nur das Modul neu compilieren lassen 
muß, das man gerade bearbeitet, werden auch die Compilezeiten kürzer (bei MaxonPASCAL 
sowieso kein Thema). 

Auch der Workspace-Speicherbedarf sinkt (bei MaxonPASC.AL sehr wohl interessant, denn das 
Programm benötigt ja einen zusammenhängenden Speicherblock, und da wird es schnell eng). 

Lange Programme werden überschaubarer, wenn man .sie sinnvoll in Module aufteilt. „Sinnvoll“ 
heißt hier, daß die Einteilung nicht willkürlich erfolgt, sondern die Module jeweils einen zusam¬ 
mengehörigen Bereich des Programms umfassen. Zum Beispiel könnte man eine 
Dateiverwaltung in die Module „Benutzeroberfläche“, „File-Handhabung“ und „Such- und 
Sortierprozeduren“ unterteilen, was sich dann noch beliebig weiter verfeinern und zerkleinern 
ließe. 

.Man kann sich aus immer wieder benötigten Programmteilen eine Bibliothek aus Modulen, die 
man bei Bedarf nur noch einlinken muß, zusammenstellen. Dafür eignet sich besonders das 
UNIT-Konzept. 

Viele Leute glauben auch, Mtxlule seinen für Programmentwicklungen im Team hilfreich, da 
dann jeder Programmierer seinen Teil des Projekts unabhängig von den anderen erstellen kann. 
Nun ja, T.e.a.m. steht bekanntlich für „Toll, ein anderer macht’s“, und der eine, an dem norma¬ 
lerweise letztendlich die ganze Arbeit hängen bleibt, kann auch ohne Modulkonzept auskom- 
men. Sollten in einem Team jedoch wirklich einmal mehrere Leute arbeiten, so ist 
Unabhängigkeit alles andere als wün.schenswert, denn es bricht regelmäßig ein Chaos herein, 
sobald die Module zusammengefügt werden sollen (.An genau dieser Stelle möchte ich mit 
einem herzlichen „Core Dumped!“ das Juhunix-Propra-Power-Team grüßen). Wenn aber 
tatsächlich einmal der unwahrscheinliche Fall eintreten sollte, daß ein Team sowohl motiviert 


MaxonPASCAL 


192 


als auch koordiniert arbeitet, könnte sich das modulare Programmieren theoretisch als nutz¬ 
bringend erweisen. 

MaxonPASCAL bietet sogar zwei verschiedene Motlulkonzepte, die in gewissen Grenzen miteinan¬ 
der kombiniert werden können. Sie sind gekennzeichnet durch die Bezeichnung UNIT oder MODU- 
LE. Zunächst wollen wir uns hier den iModulenn zuwenden, die für den Programmierer zwar etwas 
schwieriger zu handhaben, aber in gewissem Sinne flexibler einsetzbar sind. 

Ein MaxonPASCAL-Programm besteht, da wir vorerst davon ausgehen, daß wir keine Units verwen¬ 
den, immer aus einem Hauptprogramm und beliebig vielen Modulen. Jeder Teil ist nach dem 
Compilieren als sog. Objektdatei abzuspeichern, damit der Linker ihn in die anderen Teile einbin¬ 
den kann. Das Hauptprogramm sicht wie gewohnt aus, während die Module mit „Module“ statt 
„Program“ beginnen und keinen Anweisungsteil auf oberster Ebene haben. Die Verbindung der 
Komponenten geschieht über gemeinsame Variablen und Procedures, die mittels der Directives 
„IMPORU“ und „FJCPORT“ ausgetauscht werden. 

Aller nun eines nach dem anderen:' 

9.2 Syntax von Modulen 

Betrachten w'ir als erstes ein kleines Beispiel, an dem das Prinzip des Linkens schon klar wird. Hier 
ist ein Hauptprogramm: 

Program Haupt; 

Var 1:integer; EXPORT; 

Procedure p(a:Integer); IMPORT; 

Procedure q; IMPORT; 

Function f(n:integer):integer; EXPORT; 

Begin 
f:= n*n 
End; 

Begin { Hauptprogramm } 

P(20); 

q 

End, 

Dieses Hauptprogramm importiert zw'ei Prozeduren, nämlich „p“ und „q“, und exportiert die 
Funktion ..f" und die Variable „i“. Nun brauchen wir wenigstens noch ein Modul, das die importier¬ 
ten Procedures zur Verfügung stellt (es macht nichts, wenn die exportierten Bezeichner nirgendwo 
benutzt werden). Hier ist ein solches Modul: 

Moduls Unterprogramme; 


Var i: integer; IMPORT; 


9. Units und Module 


193 


Procedure p(k:integer); EXPORT; 

Begin 

i:= round(sqrt(k)) 

End; 

Procedure q; EXPORT; 

Function f(j:integer):integer; IMPORT; { lokale Funktion! ) 
Begin { von "q" ) 

writeln('Funktionswert von i, ' ist f(i)) 

End; 

Begin { leerer Anweisungsteil ) 

End; 


Zuerst zwei Anmerkungen zur Synt;ix: DaB die Direktiven „Import“ und „Expon“ hier groß gesclirie- 
Iren wurden, hat (wie immer in PASCAL) absolut keine Bedeutung. Dies geschah nur, damit sie bes¬ 
ser auffallen. 

Auf oberster Ebene, also da, wo sonst tias Hauptprrjgramm steht, hat das Modul einen leeren 
Anweisungsteil. Er hätte auch - wie oben ei-wähnt - ganz weggelassen werden können. Auch haben 
Sie die Wahl, ob Sie am Ende dieses Pseudo-Hauptprogramms einen Punkt, ein Semikolon (wie 
oben geschehen) oder auch gar nichts setzen. Es ist nicht möglich, zwischen dieses „Begin End“ 
irgentlwelche Befehle zu setzen. 

Die Syntax eines Moduls unterscheidet .sich davon einmal abgesehen also nicht von der eines 
Programms: 

"MODULE" Programmkopf 
Deklarationstell 

["BEGIN" [";"] "END" [";"l"."]] 

Syntax fiir „Programmkopf': 

Bezeichner [ "(" Bezeichner { "," Bezeichner } ")" ] [ ";" I 

Man darf also auch hinter dem Motlulnamen (der keine Bedeutung hat) eine ParameterlLste wie 
„(input,output)“ setzen - die dann ebenfalls keinerlei Bedeutung hätte. 

Eine Prozedur wird imponiert, indem man ihren Kopf hinschreibt und anstelle eines 
Prozedurblocks einfach ..Import“ schreibt. .Als Export wird sie definiert, indem man zwischen ihrem 
Kopf und Rtimpf den Bezeichner „Export'' setzt. Ein- und ausgeiuhrte Variablen werden ganz normal 
deklariert, nur daß hinter die jeweilige Deklarationszeile „Import“ bzw. „Export“ zu schreiben ist. 

ln diesem Zusammenhang hat MaxonPascal eine kleine Verbesserung gegenüber Kickpascal 2: Eine 
Prozedur, die bereits als „Import" deklariert wurde, kann später im Programm noch definiert wer¬ 
den. Sie wird dann exportiert. 


MaxonPASCAL 


194 


Beispiel: 

procedure p(i: Integer); 

Import; 

{ ... ) 

procedure p; { Parameterliste ist ja schon bekannt) 
begln 
{ ... } 
end; 


Wozu das gut sein soll? 

Nun, dadurch können Sie jetzt in Pascal das Modulkonzept von C imitieren. Sie können in eine 
Includedatei zunächst sämtliche globalen Funktionen als „Import“ deklarieren und diese Datei dann 
in jedes Modul includieren. Dadurch sind automatisch alle globalen Funktionen in allen Modulen 
bekannt und können dann an beliebiger Stelle „für den Export“ definiert werden. 

Aber zurück zum Beispiel: 

Das Flauptprogramm ruft als erstes die Prozedur „p“ mit dem Parameter 20 auf. Diese Prozedur wird 
aus dem Modul importiert und initialisiert die Variable „i“, die sie wiederum aus dem Hauptmodul 
importien hat. Die Prozedur „q“, die das Hauptprogramm als nächstes aufruft, importiert die 
Funktion „f lokal, so daß sie nur innerhalb von „q“ bekannt ist. Es ist aber nicht möglich, umge¬ 
kehrt eine lokale Prozedur oder Funktion zu exportieren. 

Es sei noch einmal daraufhingewiesen, daß ein Programm stets aus genau (!) einem Hauptprogram, 
aber beliebig vielen Modulen besteht. 

9.3 Objektdateien und Linkersteuerung 

Wenn Sie die obigen Listings so von MaxonPASCAL compilieren lassen, ist der Compiler zwar einver¬ 
standen, aber der Linker meldet Fehler, weil die importierten Bezeichner nirgendwo definiert wer¬ 
den. Also müssen Sie ihm irgendwie .sagen, was er einlinken soll. 

Dazu brauchen Sie zunächst einmal Objektdateien, für jeden Bestandteil des Programms einen. 
Lassen Sie also das „Llnterprogramm'‘-Modul compilieren und ignorieren Sie die Linker- 
Fehlermeldungen. Jetzt können Sie weder das Programm ausführen noch eine Exe-Datei schreiben 
lassen. Eine Objektdatei kann man aber unabhängig vom Linker erzeugen lassen. Tippen Sie nach 
dem Compilieren also „0“ (oder wählen Sie das entsprechende Pull-Down-Menü) und speichern Sie 
die Objektdatei ab. Diese Datei enthält den Programmctxle des Moduls und .Angaben über die 
deklarieren Bezeichner. 

Laden Sie nun das Hauptprogramm. Jetzt müssen Sie dem Unker sagen, daß die zuvor erzeugte 
Objektdatei dazu gehört, und zwar mit der Compiler-Anweisung „link“: 


{$link 'paacal:modul.o'} 


9. Units und Modulc 


195 


Diese Anweisung können Sie an eine beliebigen Stelle des Quelltextes von „Haupt“ setzen. Wenn 
der Compiler auf diese Directive trifft (siehe dazu auch Kapitel „Compiler-Directives"), lädt er sofort 
die entsprechende Datei. Es gibt dafür zwei naheliegende Positionen; Entweder nahe der Stelle, wo 
die zugehörigen „Import“- Deklarationen stehen (ist übersichtlich, weil man dann sofort sieht, was 
woher kommt) oder als allerletzte Zeile ganz am Programmende. Letzteres ist während der 
Programmentwicklung praktisch, weil man in tler Regel immer wieder neue Compiler- 
Fehlermeldungen verursacht, w'ährend man heim Linken eigendich nichts mehr falsch machen 
kann, sobald Im-/Exporte erst einmal stimmen. Deshalb will man so schnell wie möglich wissen, ob 
das gerade bearbeitete Modul syntaktische Fehler enthält und wird deshalb die Anweisungen zum 
(bei Diskettenbenutzung erwähnenswerte Zeit erforderndes) Laden von Objektdateien ans Ende 
.setzen, so daß sie erst ausgefuhrt werden, wenn sonst alles OK ist. 

Wie dem auch sei, nun wird der Compiler irgendwann auf die Disk oder Platte zugreifen und die 
genannte Objektdatei laden, Nach dem Cttmpilieren prüft der Hnker wieder, ob alle irgendwo (im 
Hauptprogramm oder einem eingelinkten Modul) als Import deklarierten Bezeichner irgendwo 
exportiert werden. Er gibt dann eine vollständige Liste aller Undefinierten Bezeichner aus oder, 
wenn alles klar ist, „Ready“, ln letzterem Fall haben Sie ein lauffähiges gelinktes Programm vorlie¬ 
gen. Sie können es wie gewohnt stanen oder eine Exe-Datei eiv.eugen lassen. 

Die Benutzung von „Hink“ ist nicht ganz problemlos, wenn Sie Ihre Programmdateien in ein ande¬ 
res Verzeichnis kopieren und dort neu compilieren wollen. Dann müssen Sie in jedem Quelltext vor 
dem Übersetzen die Dateinamen in den Linker-Anweisungen von Hand ändern. 

Cm das zu umgehen, bietet Ihneti „Hink“ iKX'h eine interessante Option: Wenn der Dateiname der 
Objectdatei keinerlei Pfadangabe enthält (d. h. im Namensstring weder ein noch ein vor¬ 
kommt), wird der Pfad des Dateinamens der im Editor gehaltenen Datei vor den Objectdateinamen 
gehängt (Sätze gibt's...), Beispiel: ln einem Quelltext namens „PASCAL:Sources/Chaos/Name.p'‘ 
taucht die .Anweisung {$link „Hilfsmodul.o" } auf Dann lädt der Linker die Objectdatei 
„PASCAL:Sources/Chaos/Hilfsmodul.o“. 

Dem Linker ist es übrigens, im Gegensatz zum Compiler, egal was ein Hauptprogramm und was ein 
Modul ist. Der Compiler bringt ihm das bei, indem er das Hauptprogramm immer automatisch den 
Bezeichner „_main“ exportieren und jedes Modul diesen Bezeichner importieren läßt. Dadurch ist 
gewährleistet, daß ein Programm nur korrekt linkbar ist, wenn es einerseits mindestens ein 
Hauptprogramm (sonst wäre der Bez.eichner „_main'' ja Undefiniert) und andererseits auch höch¬ 
stens ein Hauptprogramm enthält (sonst würde ein Doppel-Export von „_main" als Fehler gemel¬ 
det). 

Dieses „_main“ markiert übrigens den Anfang des Hauptprogramms, und am .Anfang des Codes 
jedes Moduls steht ein ,Jmp“ (das Äquivalent im Maschinensprache zum „Goto“ in PASCAL) zu eben 
diesem Syanbol. Das hat dann wiederum die Konsequenz, daß Sie in obigen Beispiel auch 
Hauptprogramm und Mtxlul vertauschen könnten, also erst ein Object-File des Hauptprogramms 
erzeugen und es dann in das Modul einlinken lassen. 



MaxonPASCAL 


196 


ln der praktischen Programmierung vvirci es sinnvoiierw'eise so ausselien, daß Sie Objekltlateien von 
allen Modulen und vom llauptprogramm anlegen und dann den Quelltext mal der einen, mal der 
anderen Komponente im Etiitor bearbeiten. Dabei enthält jeder einzelne Quelltcxt die Com|iiler- 
Directives, die alle anderen Teile einladen, Wetin Sie jeweils einen Text verbe.ssert und ausgetestet 
halxm und an einem anderen Programmteil Weiterarbeiten wollen, sollten Sie vor dem Latlen des 
nächsten Quelltexts zuerst das Ergebnis Ihrer Arbeit als Objektdatei abspeichern. Das geht vom 
Tastatumienii ja sehr bet|uem, wenn Sic sich an den vorgeschlagenen Dateinamen halten: Es kostet 
Sie nur die beiden Tastendrücke „0“ und „Return“ - und natürlich, falls noch nicht geschehen, auch 
noch die Taste „S“ zum Al»|X‘ichern der neuesten Version des Quelltextes, 

Eine übjekttlatei enthält immer nur den (xKle des zuvor compilierten Programmteils, nicht etwa 
auch die mit {$link } eingeladenen Codestücke <xler das MaxonPASCAL-latufzeitsystem. Sie brau¬ 
chen also beim oben Ixschriebenen Programmierablauf nicht zu befürchten, daß ein Teil im Code 
doppelt auftaucht. 

Seit .MaxonPascal 3 ist „Jlink" aber ziemlich ülxrflüssig, denn es gibt ja die Projektverwaltung 
„Make“. ,,$link‘' wird im Make-Modus ignoriert. 

9.4 Alink-Kompatiblität - Fluch und Segen 

Der integrierte Linker von MtixonP.VSCAI, ist im wesentlichen zum AMIGA-Standardlinker ,Alink“ 
bzw. der PD-Version „Blink“ kompatibel, w'enn er auch einige weniger wichtige Features dieses 
Linker-Standards nicht unterstützt. Dtts hat die erfreuliche Konsetjuenz, daß Sie probletnlos 
Assembler-Routinen einlinken können (siehe übernächstes Kttpitel), denn fast alle AMIGA- 
Assembler erzeugen Alink-kompatible Objektdateien. Aber es gibt auch einen Nachteil: Da der Alink 
im Prinzip für alle Programmiersprachen verevendet w'ird, hat er keinerlei Vorstellung davtm, was 
eine Prozedur oder eine Parameterliste ist. 

Seine Arbeit beschränkt sich darauf. Bezeichner zuzuordnen: Wenn ein Bezeichner irgendwo 
benutzt und anderswo tlel'tniert wird, trägt er an der ersten Stelle die entsprechende Adresse ein - 
sonst nichts. 

Das bedeutet für Sie als PASCAl.-Pmgrammierer. daß Sie .selbst auf die modulüberschreitende 
Semantik achten müssen. Sie könnten zum Beispiel versehentlich in einem .Modul eine Variable 
exportieren und in einem amleren Modul eine gleichnamige Prozedttr importieren. Eiy>ebnis: Der 
Compiler weiß nichts über tiie anderen Module und meldet deshalb keinen Fehler, der Linker, der 
keine Ahnung von P.ASC.M. hat, stellt hier eine Namensgleichheit fest. Zur laufzeit wird das 
Prograitim dann mit einen Unterprogrammaufruf in einen Dtttcnbereich springen - ein Fall für den 
Fxception-Handler. 

Ein anderes Beispiel: ein Modul exportiert eine INTEGER-Variable (mit 2 Bytes Speichertxdarf), ein 
anderes importiert diese als 4 Byte lange LONGINT-Variable. Wenn das importierende .Modttl nun 
lesend auf die Variable zugreifi, ist das Eigebnis Undefiniert, und wenn es schreibend zugreift 
(Wertzuweisung), wird über den für die INTEGER- Variable re.sertierten Bereich hinaus geschrieben 
- mit unabsehbaren Folgen. 



9. Units und Module 


197 


Auch ist es wichtig, claK beim Im- und Export von Prozeduren und Funktionen die Parameterlisten 
der Import- und Export-Deklaration äquivalent sind - auch hier können Sie sonst „nette“ Übera- 
schungcn erleben. Aus all’ dem folgt für Sie, daß Sie bei Im- und Exporten aller Art höllisch aufpas- 
.sen müssen, 

.Als PASC,Al,-Programmierer sind Sie es gewohnt, daß „Test“, „test“ und „TEST“ lediglich verschiede¬ 
ne Schreibweisen für den selben Bezeichner sind, denn in PASCAL ist die Groß-/Kleinschreibung ja 
egal. Nun wurde der Alink ursprünglich Für C und Assembler geschrieben, und da ist (bei C immer, 
bei den A.M1GA-Assembler meistens) die Schreiliweise eines Bezeichners signifikant. Folglich mag 
der .Alink es nicht, wenn man eine Prozedur „Hallo“ exitortiert, aber „hallo“ importiert - für ihn sind 
dies völlig verschiedene Bezeichner. 

Das ist natürlich nicht schön. Deshalb hat der ins MtixonPASC.AL-System integrierte Linker eine 
(Default-mäßig eingeschaltete) Option, die ihn veranlaßt, die Groß-/Kleinschreibung zu ignorieren. 
Diese Option wird mit dem Pull-Down-Lintermenü „OptionemTinker“ geschaltet. Wenn man sie aus¬ 
schaltet („GUOSS/ddein beachten“ angewälüt), müssen die Bezeichner in der IMPOKT-Zeile genau so 
wie in der EXPORT-Deklaratitin geschrieben w^erden - wie man ihn im Rest der Module schreibt, ist 
Sache des Compilers und somit dem Linker egal. 

Vielleicht fragen Sic sich jetzt, wanim es diese gegen alle lieben Gewohnheiten des P.ASCAI,- 
Programmierers verstoßentle Option überhaupt gibt. Well, vielleicht haben Sie einmal das 
Betlürlhis, Ihr Programm extern zu linken, z. B. im Zusammenhang mit der Einbindung von 
,Assembler-Routinen. Dann will man keine bösen Überra.schungen erleben, .sondern schon in der 
.MaxonPASCAL-Entwicklungsumgebung erfahren, ob der externe Linker später Fehler melden wird - 
also sollte sich der .MaxonPASCAL-l.inkerdann genauso verhalten wie sein Kollege Alink. 

9.5 Hunks 

Dieser Abschnitt ist für den „normalen“ PASC.Al.-Programmierer nicht unlredingt nötig. Ich werde 
hier die Einträge erklären, die plötzlich in der Speicherbelegungsliste auftauchen, wenn mit Units 
oder Modulen gearbeitet wird. 

AMIGA-Programmdateien - also z. B. die von Ma.xonPASC.AL erzeugten Exe-Dateien - sind in soge¬ 
nannten „Hunks“ organisiert. Es gibt im wesentlichen drei Hunktypen: 

«w CODE: Ein solcher Hunk enthält lauffähigen Programmcode. 

i«!' D.ATA; Hier können die Daten eines Programms liegen, ln Maschinencode gibt es aber keinen 
prinzipiellen Unterschied zwischen Prognimm und Daten, so daß dieser Hunktyp eigentlich 
mit „CODE“ identisch ist. 

t«' BSS: Auch hier liegen Daten, aber solche, die beim Programmstart keinen definierten Inhalt 
htiben. Ein BSS-Hunk ist deshalb eigentlich nicht mehr als eine .Anweisung an die Laderoutine, 
Siteicher zu reservieren, in dem das Programm dann z. B. Variablen unterbringen kann. 



MaxonPASCAL 


198 


Für kute, die gern in Hexdumps wühlen; Ein „CODE''-Hunk beginnt in der Datei mit dem Langwort 
$0Ü0003E9, „DAIA“ mit I000003EA und die Kennung $ÜÜ0003EB steht für „BSS“. Das Langwort nach 
der Hunk-Kennung enthält jeweils tlie Hunklänge in Langworten, danach kommt der Inhalt des 
Hunks (außer natürlich bei „BSS“, der ja keinen definierten Inhalt hat). Hinter jedem Hunk kann 
noch eine Relukationstabelle (Kennung: IÜ00003EC) stehen, die Angaben dazu enthält, wie der 
Hunkinhalt zu modifizieren ist, um ihn an eine S|reicheradresse anzupassen ■ denn im AMIGA wird 
ja grundsätzlich nicht mit festen Speicheradressen gearbeitet - und wie die Hunks verlrunden sind. 
Bitte verwechseln Sie „Hunk“ nicht mit „Hrung“, zumal sowieso keiner weiß, w'as ein Hrung ist und 
warum er gerade auf Beteigeuze 7 explodiert ist. 

Was hat das Ganze mit MaxonPASCAL und Modulen zu tun? Nun, auch Objektdateien sind aus 
Hunks aufgebaut, nur daß die Hunks zum Teil nicht über Relokationstabellen, sondern über 
Verweise auf Bezeichner verbunden sind, so daß der Linker im wesentlichen die Aufgabe hat, glei¬ 
che Symbole zu verbinden und daraus Relokationstabellen zu erstellen. 

9.6 Dynamische und statische Variablen 

Normalerweise verwalten MaxonPASCAl,-Programme ihre Variablen auf dem Stack. Beim 
Programmstart wird dort genug Platz für die globalen Variablen eingerichtet, und immer, w'enn eine 
Prozedur oder Funktion aufgerufen wird, reserviert sie sich als erstes die benötigte Menge Speicher. 
Durch dieses Variablenkonzept ist es möglich, daß jede Schachtel einer rekursiven Prozedur ihre 
eigenen Variablen hat. 

Der Compiler berechnet, wieviel Stack das Programm ohne Rekursion maximal (d. h. zum Zeitpunkt 
der maximalen Schachtelungstiefe) braucht, und gibt diesen Speicherbedarf als „Linear stack requi- 
remenf aus. 

Daneben gibt es noch ein weiteres Variablenveroaltungskonzept: Statische Variablen. Solche 
Variablen liegen in einem BSS-Hunk, sind al.so Bestandteil der Exe- oder Objektdatei und werden 
somit schon beim Laden des Programms eingerichtet. Jede statische Variable existiert dadurch 
immer genau einmal, auch lokale Variable einer rekursiven Prozedur. 

Exportierte Variable sind immer statisch, denn der Linker muß ja .schon nach dem Compilen wissen, 
w'o sie zur laufeeit im Speicher liegen, was bei tlynamisch auf den Stack geiegten Variablen natürlich 
nicht möglich wäre. Ferner sind die „globalen“ Variablen in Modulen (also die Vaiiablen, die dort 
außerhalb einer Prozedur oder Funktion deklariert werden), stets statisch. Gnjnd: Um sie auf dem 
Stack zu verwalten, müßte jedes Modul zur Compilezeit „wissen“, wie viel Platz alle anderen Module 
für ihre Variablen braucheruund wo noch Platz für die eigenen frei ist. 

Von diesen inhärent statischen Variablen merken Sie in der Regel nichts, außer, daß die 
Speicherbelegungsliste einen entsprechend großen BSS-Hunk ausweist oder daß Sie 
Schwierigkeiten bekommen, falls Sie auf die Idee kommen sollten, eine lokale Variable einer rekur¬ 
siven Prozedur zu exportieren. Sie können Variablen aber auch bewußt als statisch deklarieren; mit 
der Directive „STATIC“. Sie wird genau wie „import“ oder „Export“ hinter die Variablendeklaration 
gesetzt, z, B, so: 



9. Units und Module 


199 


Program Statisch; 

Var v: integer; 

Procedure p(£lag: Boolean); 

Var v: integer; STATIC; 

Begin 

If flag Then v:= 26731 
Else writeln(v) 

End; 

Begin 

v;= 42; 
p (true); 
p (false); 
writeln (v) 

End. 

Dieses Programm erzeugt die Ausgabe; 

26731 42 

Wie funktioniert es? Die Prozedur „p" hat eine lokale Variable „v“, die nichts mit der gleichnamigen 
globalen Variablen zu tun hat. Beim ersten Aufruf mit dem Parameter „true“ wird diese lokale 
Variable mit dem Wert 26731 initialisiert. Dadurch aber, daß „v“ statisch ist, existiert cs nach dem 
Ende der Prozedur weiter und hat beim zweiten Aufnif immer noch den selben Wen - andernfalls 
wäre er Undefiniert. 

Die globale Variable „V habe ich im Beispiel eingeführt, um zu zeigen, daß das statische „v“ zwar zur 
gesamten Laufzeit existien, aber trotzdem nicht global ist. 

Übrigens: Wenn Sie das „STATIC“ wegließen, würde sich in diesem Fall nichts an der Ausgabe 
ändern, denn zur dynamischen Erzeugung des lokalen „v" wird immer derselbe Speicherbereich 
benutzt. Zwischen den beiden Aufrufen von „p“ wäre dieser Speicher aber ungeschützt und akut 
überschrcibgefährdet. 

9.7 Externes und internes Linken mit „PasLib.o" 

Auf Ihrer MaxonPASCAL-Disk finden Sie eine Datei „paslib.o“. Sie enthält das gesamte 
Laufzeitsystem von MaxonPASCAl., also eine Sammlung von Unterprogrammen wie z. B. Ein- und 
Ausgateoperationen aller Art, die dem PASCAJ.-Programmierer zur Verfügung stehen, der Prozessor 
ater nicht ohne weiteres selbst kann. Beispielsweise ist eine .Addition zw'eier Integer-Zahlen als ein 
einziger Maschmensprachbefehl zu realisieren, während die Ausgabe einer solchen Zahl eine sehr 
komplexe Operation und nur als ein längeres Unterprogramm realisierbar ist. 

Ein identisches Laufzeitsystem ist integrierter Bestandteil des MaxonPASCAL-Systems, so daß der 
Linker es ohne Diskettenzugriff mit dem vom Compiler erzeugten Ctxle und den evil. zugeladcnen 
Mcxlulen zusammenbinden kann. Die Datei „paslib.o“ brauchen Sie deshalb nur, wenn Sie einen 



MaxonPASCAL 


200 


anderen als den integrierten Linker benutzen, z. ü, um mit dem MaxonASS eine Assembler- 
Lnterroutine zu schreiben und aus dem MaxonASS-System heraus zu debuggen (mehr dazu im fol¬ 
genden Abschnitt). 

Sie können auch „einfach mal so extern linken: besorgen Sie sich „BLink“, erzeugen Sie zu einem 
RVICU-Programm eine Objektdatei, z. B. „helio.o", und tippen Sie im CU: 

BLink helio.o, paslib.o to Hello 

Auf diese Weise erhalten Sie aus der Objekt-Datei eine lauffahige Exe-Datei. Nun benötigt wohl kein 
einzelnes Programm sämtliche Möglichkeiten, die MaxonPASCAL bietet. So wird man in der Regel 
entweder „REAL“ cxler ..LONGREAl.“ benutzen, nicht aber beide Zahlenformate durcheinander - falls 
man überhaupt Fließkomma-Operationen braucht. Um in Exe-Files nicht zu viel unnützen Code ste¬ 
hen zu haben, ist das ca. 10 KByte große MaxonPASCAL-Laufzeitsystem in mehrere „Bibliotheken“ 
unterteilt: Zum einen wäre da die knapp 4 KByte umfassende Grundlibrary. Somit gibt der Linker 
immer eine ..Maximum Code Size“ von wenigstens 3900 Byte aus. Diese Bibliothek enthält im 
wesentlichen die wichtigsten Ein-/Ausgabeoperationen, die Initialisierungs- und die Endprozedur, 
welche am Anfang bzw, Ende des Programms aufgerufen werden, die meisten laufzeit- 
Fehlermeldungen und so fort. Sie exportiert zum Linker das Symbol „_paslibbase“, das ihre 
Basisadre.sse enthält. 

Oberhalb dieser Adresse, die am Programmanfang ins Proze.ssorregister A5 geladen wird und dort 
unverändert stehen bleiben muß, stehen verschiedene wichtige Daten wie z. B. der „Global Vector", 
über den MaxnnPASCAI. die Stack-Variablen verw'altet; unterhalb der Basis steht eine Sprungtabelle 
zu den einzelnen Funktionen, 

Außerdem gibt es noch sechs weitere, nach „Themen“ geordnete Bibliotheken, die ebenfalls jew-eils 
ihre Basisadresse exportieren: 

_reallibbase; Fließkommaoperationen, einfache Genauigkeit 

_doublelibbase: Fließkommaoperationen, doppelte Genauigkeit 

_setlibbase: alle SET-Operationen 

_stringlibbase: größere Stringoperationen wie „-f“, „Insert“ usw. 

_misclibbase: diverses, z. B. „Random“, „Hi“, „CIrEoL“,... 

_amigalibbase; AMIGA-spezifisches (Windows, Messages, Console...) 

Welche Konsequenzen hat das fiir Sie als PASCAL-Programmierer? Zum einen dürfen Sie die oben 
genannten Bezeichner (und „_main“) nicht aus PASCAL-Modulen exportieren, denn sonst kommt 
es zu Konflikten. 

Wichtiger ist aber, daß der interne Linker nur die Bibliotheken des bufzeitsystems einbindet, aus 
denen auch Funktionen benutzt w'erden, während man bei externem Linken nur die Möglichkeit 
bat, alles einzuhinden. 



9. Units und Module 


201 


9.8 Units 

Das Unic-Konzept ist eine sehr leistunsslaltige Füim der modularen Programmierung. Hier werden 
Compiler und Linker durch spezielle Sprachkonstrukte näher aneinander gebunden, wodurch \iele 
Fehlermoglichkeiten, die es hei den MODULEn gilx, ausgeschlossen werden, AulSerdem bieten 
Units eine bequeme Möglichkeit, den Sprachumläng von MtixonPASCAL durch Anlagen von Unit- 
Bibliotheken nahezu beliebig zu erw'citern. 


9.8.1 Ein erstes Beispiel 

.Analog zu den MODULEn besteht ein MtwonPASCAL-Programm aus einem Hauptprogramm und 
beliebig vielen Units. Hier ist ein erstes Beispiel für ein Unit: 

UMIT Beisplell; 

{ Ein tJnit beginnt mit dem Schlüsselwort "UNIT", gefolgt vom 

Unitnamen. Während Programm- und Modulnamen bedeutungslos sind, 
werden die Unitnamen für mehrere Zwecke benötigt, so daß man 
sie sinnvoll wählen sollte. } 

INTERFACE 

{ Ein Unit besteht im wesentlichen aus zwei Teilen: dem 
"öffentlichen" (also dem Hauptprogramm und anderen Units 
zugänglichen) Interface-Teil, und dem "privaten" (für andere 
Programmteile verborgenen) Implementation-Teil. ) 

TYPE Natuerlich = 0..Maxint; 

{ Dieser Datentyp wird im Interface-Teil des Units "Beispiell" 
definiert und steht damit allen Programmen, die dieses Unit 
benutzen, zur Verfügung. ) 

VAR Grenze: Natuerlich; 

{ Dies ist eine Variable des Units "Beispiell" ) 

PROCEDURE Eingabe (VAR Zahl: integer); 

{ Diese Prozedur wird vom Unit "Beispiell" exportiert. Im 
Interface-Teil steht nur ihr Prozedurkopf, der "Rumpf" 
folgt im Implementationsteil. ) 

FUNCTION IstPrim (n: Natuerlich): Boolean; 

{ Auch diese Prozedur wird von diesem Unit exportiert. ) 

IMPLEMENTATION 

{ Hier beginnt der zweite, nicht-öffentliche Teil des Units. Er 
enthält die Rümpfe der im Interfaceteil deklarierten Prozeduren 
und Funktionen sowie alle Bezeichner dieses Units, die nicht 
exportiert werden sollen. } 


FUNCTION Teilbar (a, b: Natuerlich): Boolean; 



MaxonPASCAL 


202 


{ Diese Funktion gibt an, ob a durch b teilbar ist. } 

BEOIH 

Teilbar:= (a MOD b = 0) 

END; 

FUNCTION IstPrim; 

{ Jetzt kommt der Rumpf dieser im Interfaceteil deklarierten 
Funktion. Beachten Sie, daß der Funktionskopf hier keinerlei 
Parameter und keinen Ergebnistypen enthält, denn das vnirde 
alles ja schon im Interfaceteil definiert. 

Die Funktion soll ermitteln, ob die natürliche Zahl "n“ eine 
Primzahl ist. ) 

VAR Zaehler: integer; 

BEGIN 

Zaehler:= 2; 

WHILE (Zaehler < n DIV 2) AND NOT Teilbar(n, Zaehler) DO 
Zaehler:= Zaehler+1; 

IstPrim:= NOT Teilbar(n, Zaehler) 

END; 

PHOCEDDRE Eingabe; 

{ Auch hier wird die Parameterliste nicht noch einmal geschrieben ) 
BEGIN 

Write{'Bitte eine Zahl eingeben: '); 

Readln (Zahl) 

END; 

END. { Dies ist das Ende des Units. ) 

Wenn der Compiler dieses Unit fehlerfrei übersetzt hat (hier können Sie es ignorieren, wenn der 
Linker Fehler meldet, denn ein Unit kann man sowieso nicht direkt starten), legt er automatisch 
zwei Dateien an: Die Objectdatei „Beispiel!,o“, die wie bei Modulen den von Compiler erzeugten 
Code des Units enthält, und die Interface-Datei „Beispiel!.u“. Darin steht in vorcompilierter Form 
eine Kopie des Interface-Teils des Units. 

Aber wohin werden diese Dateien geschrieben? Im Pull-Down-.Menü „Optionen“ finden Sie den 
Menüpunkt „Suchpfade“. Wenn Sie diesen mit der Maus anwählen, erscheint ein kleines Fenster mit 
je zwei Textgadgets für IncludefUes und für Unit-Dateien. Hier interessieren uns nur die beiden 
Zeilen unter „Unit“. 

Falls Sie nur die erste Zeile benutzen, ist alles einleuchtend: Dann werden die beiden oben genann¬ 
ten Dateien in dieses Verzeichnis geschrieben. Wenn Sie zwei Pfade angeben, wird wieder derselbe 
raffinierte Trick wie bei den Include-Files angewendet: Die Dateien werden doppelt erzeugt, und 
zwar in den beiden angegebenen Verzeichnissen. Nun werden die Dateien ja nicht „einfach so“ 
erzeugt, sondern sollen auch irgend wann einmal gelesen werden (dazu später mehr). Zuerst sucht 
das PASCAL-System im ersten und dann im zweiten angegebenen Verzeichnis nach den Dateien. 
Wenn sie nur im zweiten Verzeichnis gefunden werden, werden sie ins erste umkopiert (nicht 
umgekehn!). Also können Sie als ersten Pfad ein Untei-verzeichnis in der schnellen RAM-Dlsk und 
als zweiten ein Dhectory auf Ihrer Festplatte bzw. PASCAL-Arbeitsdiskette wählen. Bequemer Lst es 


9. Units und Module 


203 


natürlich, wenn Sie die Pfade nicht nach jedem Start des MaxonPASCAL-Systems neu eintragen, son¬ 
dern mit dem Programm „PASCAI.Prefs“ die richtige Einstellung in Ihr Config-File eintragen. 

Übrigens werden bei der Unit-Handbabung wie beim lüden von Includefiles Unterv'erzeichnisse bei 
Bedarf vom PASC.ALsystem automati.sch erzeugt. 

9.8.2 USES 

Nun haben wir also ein Unit in Form von zwei bzw. vier Dateien vorliegen. Jetzt können wir es ganz 
einfach in einem unserer Programme benutzen, z, B. so: 

PROGRAM Primzahl) 

USES BelBplell; 

VAR i: Natuerlich; 

BEGIN 

Eingabe (i); 

IF IstPrim (i) THEN 

Writeln (i, ' ist prim.') 

ELSE 

Writeln ('Keine Primzahl.') 

END. 

Sobald der Compiler auf die „USES‘'-.Anweisung trifft, liest er die Datei „Beispiell.u“ wie ein Indude- 
File ein. Dadurch stehen im folgenden die Bezeichner „Natuerlich“, „Grenze“ (wird hier nicht 
benutzt), „Eingabe“ und „IstPrim“ zur Verfügung. Dabei werden Variablen, Prozeduren und 
Funktionen automatisch als „Import" behandelt. 

Außerdem veranlaßt die USES-Anweisung den Compiler, zum Schluß noch die Datei „Beispiel.o“ 
einzuladen. 

9.9 Units - Alles noch 'mal etwas genauer 
9.9.1 Syntax 

Ein Unit beginnt immer mit dem Wort „UNIT“, gefolgt vom Unit-Namen, der ein Bezeichner ist. 
Dahinter beginnt automatisch der Interface-Teil. Sie können dies dadurch deutlich machen, daß Sie 
das Wort „Interface“ schreiben. Dies kann aber auch ersatzlos entfallen. 

Danach können USF.S-Zeilen folgen, denn ein Unit kann selbst wieder andere Units benutzen. Diese 
Zeilen haben folgende Syntax: 

ases-Deklaration= { [ "FROH" Bezeichner ] "USES" Bezeichner { 

Bezeichner } ";" } 



MaxonPASCAL 


204 


Ein Beispiel; 

0SES Intuition, Graphics; USES Beispiel!; 

Was es mit dem „FROM“ auf sich hal, werde ich später verraten. 

Nun folgt der Rest des Interface-Pans, Hier kann folgendes Stehern 

• Konstanten 

• Datentypen 

• Variahlen 

• I.ibrarys 

• Prozedur- und Funktionsköpfe 

Wie üblich sind Sie an keine feste Reihenfolge gebunden, Inbels können hier nicht deklariert wer¬ 
den. 

,\lso hat der Interfaceteil eines Units die.se Syntax: 

Interfaceteil = 

[ "INTERFACE"] Uses-Deklaration { Konstantendefinition | 
Typdefinition | Variablendeklaration | Librarydeklaration | 
Prozedurkopf | Funktionskopf } 

Intern behandelt der Compiler die hier deklarierten Funktionen und Prozeduren wie FÜRW'ARD- 
Deklarationen. Sie können aber auch als EMPÖRT bzw. EXTERNM. deklariert werden, aber nicht als 
EXPORT, denn sie w'erden ja sowieso exportiert. 

Mit tiem Wirrt ..IMPLEMENTATION“ beginnt dann der andere Teil des Units. Er ist wie ein nonnaler 
Deklarationsteil eines Blocks aufgebaut und endet entweder mit einen „END“ oder dem 
Initialisieiirngsteil (dazir später mehr). Ms letztes darf (I) ein Punkt txler ein Semikolon stehen: 

Implementationsteil = 

"IMPLEMENTATION" Deklarationsteil ("END" | Anweisungsteil) | 

";" ] 

Damit hätten wir auch .schon die vollständige Synuix für ein Unit: 

Unit = "UNIT" Bezeichner [ ] Interfaceteil Implementationsteil 

Im Implementationsteil müssen alle Prozeduren und Funktionen, deren Kopf im Interfaceteil dekla¬ 
riert wurde, definiert werden. Die Reihenfolge der einzelnen Prozeduren ist dabei egal. Hier besteht 
ihr Kopf aber nur noch aus dem Schliissselwort PROCEDl.iRE bzw. FUNCTION und dem Namen, die 
Parameterliste muß (und darf) nicht noch einmal angegelren werden. 



9. Units und Modulc 


205 


9.9.2 Units und Module 

Units können von Programmen, Modulen und anderen Units mittels USES aufgerufen werden. Zwei 
oder mehr Units dürfen sich aber nicht gegenseitig aufrufen. Es besteht also teilweise eine .'\rt 
Hierarchie unter den Units eines Pi-ognimms, während MODULEs als gleichrangig behandelt wur¬ 
den. 

Ein Llnit-Aufmf aus einem MODULE könnte so au.sselien: 

Module Modul; 

Uees Crt; 

Procedure Ausgabe; Export; 

Begln 

writelnt'Hallo!'); 
delay(50) 

End; 

Begin End { Ende des Moduls ) 

Dieses Modul benutzt also das Standard-linii „Crt“, das liesondere Prozeduren und Funktionen Rir 
die Bildsdürm-Ein-./Ausgabe definiert. Ein geeignetes Hauptprogramm zu diesem Modul könnte wie 
folgt aussehen; 

Program Haupt; 
üses Crt; 

Procedure Ausgabe; Import; 

Begin 

Ausgabe 

End. 

{$link "Modul.o" } 

Obwohl das Hauptprogramm das Unit „Crt“ nicht direkt benutzt, muß in diesem Fall die entspre¬ 
chende USES-Anweisung gesetzt werden. Dadurch weiß der Compiler, daß er den Code dieses Units 
laden und dessen Initialisierungsteil (dazu später mehr) aufrufen muß. 

Wenn Sie die neue ProjekO'erwaltung „Make“ venvenden, müssen Sie alle Units, die irgendwo im 
Projekt benutzt w'erden, in das Uadget „Make-Units“ des Comirilerrequesters eintragen, damit der 
Linker weiß, was er laden muß. 



MaxonPASCAL 


206 


9.9.3 Schachtelung von USES-Aufrufen 

Nun wollen wir uns noch ansehen, was genau der Compiler beim Aufruf von Units macht. Dazu 
betrachten wir einige Sourcefragmente: 

üilit A; 

Interface 

{ Definitionen von Unit A } 

Implementation 

End. 

Unit B; 

Interface 
Uses A; 

{ Definitionen von Unit B } 

Implementation 

End. 

Unit C; 

Interface 
Uses B; 

{ Definitionen von Unit C ) 

Implementation 

End. 

Unit D; 

Interface 
Usee C,A; 

{ Definitionen von Unit D } 

Imp 1 ement at ion 

End. 

Program Hauptprogramm; 

Uses B,D; 

Begin ( Hauptprogramm ) 

End. 

Als erstes müssen wir hier das Unit A compilieren, da alle anderen Programmteile direkt oder indi¬ 
rekt davon Gebrauch machen. Das Unit B benutzt nur Unit A und kann also direkt danach übersetzt 
werden. 

Erst jetzt kann Unit C compiliert werden. Dabei geschieht folgendes; Durch „Uses B" wird der 
Compiler angewiesen, den Interface-Teil von Unit B zu übersetzen. Dort steht als erstes „Uses A“, so 
datl auch noch der Interfaceteil von Unit A und erst dann der Rest vom Interface des Units B gelesen 
wird. Dann wird das Unit C zu Ende übersetzt, wobei dem Compiler die Interface-Deklarationen der 
Units A und B bekannt .sind. 

Interessant wird es nun beim Unit D, das erst C und dann A mittels „Uses“ benutzt. Zuerst wird Unit 
C aufgerufen, welches Unit B, das wiederum Unit A benutzt, voraussetzt. Es werden durch die 
.Anweisung „Uses C“ also nacheinander die Interfaceteile von A, B und C (in dieser Reihenfolge) 



9. Units und Module 


207 


gelesen. Nun geht es weiter im Unit D; es soll zusätzlich noch Unit A benutzt werden. Nun merkt 
der Compiler aber, daß A sch(rn gelesen wurde und liest es deshalb nicht noch einmal. Somit ist 
„Uses A“ hier überflüssig. (Es hat aber doch eine Wirkung: Das Unit A wird an die erste Stelle der 
Unit-Liste gesetzt, was wichtig sein kann, wenn mehrere Units gleichlautende Bezeichner definieren. 
Dazu im nächsten Abschnitt mehr.) 

Zuletzt betrachten wir noch das Hauptprogramm. Es benutzt die Units B und D und damit - wie wir 
bereits wissen - indirekt auch die beiden anderen. Zuerst liest es also das Unit A, um B lesen zu kön¬ 
nen. Bevor danach D ge-used wird, muß nur noch C gelesen werden, denn A und B sind ja bereits 
bekannt. Die Reihenfolge der benutzten Units ist also A-B-C-D, genau die selbe, als wenn man im 
Hauptprogramm nur „Uses D“ geschrieben hätte. Somit ist die „Uses B"-Anweisung hier völlig über¬ 
flüssig. 


9.10 Bezeichner-Handhabung in Units 

Units sind wunderbar dazu geeignet, den Befehlsumfang von MaxonPASCAI. den eigenen 
Bedürfnissen entsprechend zu erweitern: Man schreibe sich ein Unit mit den neuen Prozeduren, 
Funktionen, Datentypen etc. und übemetze es einmal - schon kann man es in jedes Programm mit 
einer einzigen USES-Anweisiing einbinden und hat die exportierten Bezeichner dieses Units zur 
Verfügung. Man kann sogar Units an andere Programmierer weitergeben (sogar verkaufen...), ohne 
die Quelltexte herausgeben zu müssen: es genügt, wenn der Benutzer die Dateien „MeinUnit.u“ 
und „MeinUnit.o“ liekommt. 

Stellen Sie sich aber einmal folgendes vor: Von einem Freund halren Sie ein Unit „Matrix" bekom¬ 
men, das Prozeduren für Matrixoperationen enthält. Auf einer PD-Diskette fanden Sie ein Unit 
„LongMath“, das Prozeduren für das Rechnen mit beliebig großen natürlichen Zahlen definiert. Da 
Sie ein Mathematik-Frerak sind, wollen Sie nun in einem Programm beide Units benutzen. Beim 
Durchlesen der Dokumentationen zu den lieiden Units erschrecken Sie: beide Units definieren eine 
Prozedur oder Funktion namens „Mult", nämlich für die Multiplikation von Matrizen bzw. langen 
Zahlen. Was sollen Sie jetzt tun, zumal Sie von keinem der Units den Quelltext haben, die Namen 
der Prozeduren also nicht ändern können? 

Ich kann Sie beruhigen: das Ganze ist kein l’roblem, denn Units dürfen ohne weiteres identische 
Bezeichner exportieren. Sie können die beiden oben genannten Units also etwa so in Ihr Programm 
einbinden: 

PROQRAM Mein_geniales_Mathematilcprograniin; 

USES Matrix, ( Geschrieben von Kasimir Müller, Juli 1990 ) 

LongMath; { Gefunden auf der PD-Dlsk "Quickstart #0815" ) 

Nun bezieht sich der Bez.eichner „Mult" auf das als letztes geladene Unit, also „LongMath“. Das ist 
natürlich noch immer nicht schön, denn im Zweifelsfall wollen Sie in Ihrem Programm sowohl 
Matrizen als auch große Zahlen multiplizieren. Dafür gibt es in .MaxonPASCAL ein besonderes 
Sprachkonstrukt; Qualifizierte Bezeichner. 



MaxonPASCAL 


208 


Rill Bezeichner wird ..qualifiziert“, indem man ihn den Namen de.s lJnit,s, in dem er definien wird, 
voranstellt - mit einem Punkt getrennt. Also können Sie in „Ihrem genialen .Mathematikprogramm“ 
mit „Matrix.Mult ‘ und „Longkiath.Mult" gezielt auf die beiden Prozeduren zugreifen. 

Globale Bezeichner von Programmen können dunii Voranstellen de.s Programmnamens „qualifi¬ 
ziert“ werden, und die vordefinierten Standardtezeichner von MaxonPASCAl. bilden ein Pseudo- 
Unit namens „System . Also kann man durch selbstquälerische Qualifizierungen sogar 
Standardbezeichner iiberdefinieren und trotztlem benutzen, wie es im folgenden Beispiel mit der 
Prozedur „Writeln“ geschieht: 

PROGRAM Qual; 

VAR Writeln: integer; 

BEGIN 

Qual.Writeln:= 42; 

System.Writeln(Qual.Writeln) 

END. 

Es dürfte problemlos konsensfähig sein, daß qualifizierte Bezeichner nicht gerade das Gelbe vom Ei 
sind, zumal sie zusätzlichen Sebreibaufwand erfordern, was Freaks sowieso vermeiden, w'o sie nur 
können. Deshaib .sollten sie eine Notlösung in Fällen wie dem oben beschriebenen sein, während 
man bei selbstgeschriebenen Units darauf achten sollte, daß die e.xportierten Bezeichner nicht mit 
denen anderer Units kollidieren. 

Für l£ute, die alles ganz genau wissen wollen, soll jetzt noch erläuten werden, wie der Linker mit 
Units umgeht. Bekanntlich legt der Compiler für jedes Unit zwei Dateien am Die Interface-Datei mit 
der Endung „.u“ und die Objektdatei, zu erkennen an der Endung „.o“. 

Erstere wird von Compiler gelesen, sobald er auf eine entsprechende USES-Anweisung stößt, letzte¬ 
re wird an.schließend vom Linker in das Ilauptprogramm eingebunden. Dabei werden wie bei den 
-Modulen Bezeichner an den Linker übergeben, und zwar alle Namen der Variablen, Prozeduren und 
Funktionen des Imerfaceteils - die dort definierten Konstanten, Datentypen und libraty's sind ja nur 
für den Compiler von Interesse. 

Wenn Sie die Kajütel über Module aufmerksam gelesen haben, wissen Sie vielleicht noch, daß der 
Linker dopjielte Deklarationen gleichnamiger Bezeichner als Fehler meldet. Dagegen können, wie 
oben beschrieben, verschiedene Units durchaus (lensellx;n Bezeichner exponieren. Um dieses 
Problem zu umgehen, werden die Bezeichner „tiualifizien“ an den Linker übergeben. Im obigen 
Beispiel (dem „genialen“ Matheprogramm) heißt das, daß an den Unker die beiden Bezeichner 
„.Matrix..Mult“ und „Long.Math.Muh“ übergeben werden. 

Bekanntlich können Sie über ein Pull-Down-Menü einstellen, ob der Linker die Groß- 
/Kleinschreibung von Bezeichnern beachten soll. Falls Sie nun den weniger toleranten Modus 
wählen, können Sie eine Üterraschung erleben, wenn Sie in der Uses-Zeile die Unitnamen falsch 
schreiben, z. B. „USES matrix“: Der Compiler erfährt dann zwar aus dem Interläcefile, daß die zu 
importierende Prozedur „Mult“ heißt, glaubt aber fälschlich, das Unit heiße „matrix". Also wird ver- 



9. Units und Module 


209 


sucht, in das Hauptprogramm den Bezeichner „matrix.Mult“ zu imponieren - exponiert wird aber 
lediglich der Name „Matrix.Mult“. ,\lso meldet der Hnker einen Undefinierten Bezeichner. 

,\us demselben Grunde ist es auch nicht möglich, einem coin|)iliert vorliegenden Unit einen ande¬ 
ren Namen zu geben: Sie können zwar auf der Diskette die Dateien umbenennen, enx'a von 
„Matrix,*" in „Mat,*", und diese Units dann mit „LISES Mat“ benutzen. Die in der Datei „Matrix.o“ 
exportierten Bezeichner tragen aber weiterhin Namen wie „Matiix.xxx“, während Ihr Programm nun 
„Mat.xxx" importieren will. Ergo meldet der l.inker massenhaft Fehler. 


9.11 Initialisierung und andere Spezialitäten 
9.11.1 Initialisierungs-Prozeduren 

In der formalen Syntax von Units wurde bereits angedeutet, dalS man Units mit so etwas wie einem 
Hauptprogramm versehen kann. 


UNIT Beispiel2; 

INTERFACE 

VAR n: integer; 

PROCEDÜRE Ausgabe; 

IMPLEMENTATION 

PROCEDÜRE Ausgabe; 

BEGIN 

Wrlteln ('n = ', n) 

END; 

BEGIN { Initialisierungsteil ) 

Write (’n wird initialisiert: '); 
n:= 99; 

Ausgabe 

END. 

Ein Hauptprogramm dazu könnte so aussehem 

PROGRAM Haupt2; 

USBS Beispiel2; 

BEGIN 

n:= n+1; 

Write('Neuer Wert von n: '); 
Ausgabe 
END. 



MaxonPASCAI. 


210 


Das Unit hat also am Ende einen gloltlalen Anweisungsteil, der mit einem „END" endet (sonst enden 
Units ja mit einen „END“ ohne vorangehenden Anweisungsteil). Diese Anweisungsfolge wird der 
Initialisietungsteil des Units genannt und automati.sch vor dem Start des Hauptprogramms, das die¬ 
ses Unit benutzt, ausgeführt. 

Also erzeugt unser kleines Programm folgende Au.sgabe; 

n wird Initialisiert: n = 99 
Neuer Wert von n: n = 100 

Intern wird das so gehandhabt, daß der Init-Teil als Prozedur mit dem qualifizierten Namen „ init“ 
an den Unker exportiert wird, in unserem Beisiriel also „Beispiel2.Jnit“. Deshalb können s7e im 
Interfiiceteil eines Units keine Prozedur, Funktion oder Variable mit dem Namen „Jnif deklarieren, 
denn dann würde der Linker ja eine Bezeichnerkollision feststellen und als Fehler melden. 

Der Aufruf von Initialisierungsteilen erfolgt im Zweifelstall genau ,so, wie man sich das wünscht. Ich 
möchte nur deshalb genauer darauf eingehen, damit Sie nicht sagen können, das sei nirgendwo 
dokumentiert: 

1 . Der Initialisierungsteil jedes direkt oder auch indirekt benutzten Units eines Programms wird 
genau einmal aufgerufen, auch dann, w'enn ein Unit mehrfach benutzt wird (indem es von meh¬ 
reren benutzten Units ge-used wird). 

2. Benutzt ein Unit A ein anderes Unit B, so sorgt MaxonPASCAL dafür, daß in jedem Fall der 
Inidalisierungsteil von Unit B vor dem von Unit A aufgerufen wird. Sie können also beim 
Programmieren eines Init-Teils davon ausgehen, daß alle Units, die Sie in Ihrem Unit benutzen, 
bereits initialisiert sind. 

3. Von 2. einmal abgesehen, werden Units in der Reihenfolge winitialisiert, in der sie in der USES- 
Anw'cisung stehen. 

9.11.2 Prüfsummen 

Wie Sie bereits wissen, wird der Compiler durch eine USES-Anweisung veranlaßt, die Interface-Datei 
des entsprechenden Units zu lesen. Dort erfahrt er, welche Bezeichner in das gerade übersetzte 
Unit oder Programm importiert werden, und vor allem auch, welche Bedeutung diese Bezeicher 
haben. So weiß er nach „USES Beispiel2“ (siehe oben), daß „n“ eine Integer-Variable und .Ausgabe“ 
eine Prozedur ohne ParameteriLste ist. Mit diesem Wissen ward nun der Rest des Programms über- 
setzt. So weil, so hoopy. Aber jetzt kommt’s: 

UNIT A; 

VAR n: Longint; 

IMPLEMENTATION 


BEGIN 



9. Units und Module 


211 


n:= 26731 
END. 


Dieses kleine Unit werde nun von einem zweiten benutzt; 

UNIT B; 

USES A; 

PROCEDÜRE Ausgabe; 

IMPLEMENTATION 

PROCEDURE Ausgabe; 

BEGIN 

Writeln(n) 

END; , 


END. 

Dies alles ist ncMth völlig klar und einsichtig: Das Unit exportiert eine Prozedur, die eine vom Unit 
,A“ imponierte Urnglnt-Variable ausgibt. Aber jetzt (die Spannung steigt ins Unerträgliche...) kommt 
das Hauptprogramm dazu; 

PROGRAM C; 

USES B; 

BEGIN 

Writet'Wert von n: '); 

Ausgabe 

END. 

Auch jetzt haben wir noch nicht den springenden Punkt erreicht. Der kommt erst, wenn wir das 
Unit ,A“ ändern; Wir deklarieren die Variable „n“ im Interface-Teil nicht mehr als Longlnt, sondern 
nur als einfaches Integer, und compilieren dieses Unit mit dieser Änderung. 

Und nun (und damit wären wir endlich beim Thema) versuchen wir erneut, unser Hauptprogramm 
zu übersetzen. 

„Na und?“ 

Das hüpfende Komma (oder so ähnlich) ist, daß das Unit .,B'' nach der Änderung von ,A“ noch nicht 
wieder neu übersetzt wurde. Ergebnis: der vom Compiler erzeugte Maschinencode jenes Units 
giaubt immer noch, „n“ sei eine Longlnt-Variable. Resultat; Die Prozedur .Ausgabe“ liest ein 
Langwon (Longlnt = 4 Bytes) aus dem Speicher und gibt es aus, obwohl dort nur ein Wort (Integer 
= 2 Bytes) für die Variable reserviert und initialisiert sind. Ergebnis; Es wird ein Undefinierter (also 
im Zw'eifelsfall unsinniger) Wert ausgegeben, und Sic werden bei der Suche nach dem vermeintli¬ 
chen Bug halb wahnsinnig (falls wir einfach ‘mal so tun, als ob die Units und das Hauptprogramm 
jeweils so ungefähr tausend Zeilen lang und entsprechend unübersichtlich wären). 



MaxonPASCAL 


212 


Aller keine Panik: das Ganze passiert nämlich absolut NICHT! MaxonPASCAL ist clever genug, das 
Problem zu erkennen, und meldet heim Compilieren des Programms „C“ in der ÜSES-Zeilc: 

Checksum Error: Unit "B" using different "A". 

Alles klar: Das Unit „B“ benutzte, als es compiliert wurde, ein Unit ,A“, das sich von dem jetzt vorlie¬ 
genden unterscheidet. Nun wssen wir also, daß das Unit „B” neu compiliert werden muß. Am 
betiuemsten benutzt man dttzu das Pull-Down-Menü „Stanen/Compile Datei“ bzw. das 
Tastaturmenü „eXternal". 

Obige Fehlermeldung enthält auch einen Hinweis darauf, woran der Compiler den Fehler bemerkt 
hat: Er legt zu jedem Unit eine Prüfsumme an. Dann werden im Interfacefile jedes Units die 
Prüfsuramen aller benutzten anderen Units vermerkt. Beim Lesen des Interfaceteils von Unit „B“ 
stellte MttxonPASCAL fest, daß das hier lienutzte Unit „A“ nach dem letzten Übersetzen von Unit .,B“ 
verändert wurde. 

Die Prüfsumme (32 Bit breit) wird übrigens nur überden Interface-Teil eines Units gebildet. Es hät¬ 
te also keine Folgen gehabt, wenn Sie nur im Implemematittnsteil von Unit „A“ etwas geändert hät¬ 
ten - denn das ist ja sowieso Privatsache dieses Units. Ferner gehen nur die wesentlichen Teile des 
Interfaceteils in die Prüfsumme ein, also keine Kommentare, k'er/eilen und andere Layout-Details. 

9.12 Projekte - Modulares Programmieren mit Units 
9.12.1 Aufräumen im Unit-Verzeichnis 

Units sind, wie Ihnen nicht entgangen sein dürfte, ein .sehr leistungsfähiges Konzept, das Sie sicher 
oft benutzen werden. Auf die Dauer wird sich da einiges in Ihrem Unit-Verzeichnis ansammeln: 
Standard-Units, selbstgeschriebene Unius, diverse Units für alle möglichen Zwecke, die Sie auf Ihren 
MaxonP,ASC/\L-Disketten oder in anderen Quelltextsammlungen gefunden haben usw. - und zwar 
jeweils zwei Dateien pro Unit. Somit dürfte Ihr Unit-Verzeichnis im kufe der Zeit ganz schön voll 
werden. Irgendwann riskieren Sie dann auch, die Übersicht zu verlieren und einem Unit einen 
bereits vorhandenen Namen zu geben, wodurch das andere Unit überschrieben würde. 

Was können Sie also gegen das drohende Chaos unternehmen (einmal davon abgesehen, daß Sie 
nicht mehr benötigte Units löschen können und sollen)? Seit dem Dahinscheiden von CP/M (die 
tüteren unter Ihnen werden sich vielleicht noch daran erinnern - auch ich habe z. B. auf einem unter 
CP/M laufenden Applell-Clone PASCAl, gelernt, damals, in der guten alten Zeit... aber lassen wir 
das!) bietet jedes real existierende Betriebssystem (die 1541 und andere immer noch produzierte 
Fossilien übergehen wir hier einmal - so etwas KENNT man als AMIGA-User gar nicht) eine 
Möglichkeit, Verzeichnisse aller Art aufeutäumen: Richtig, Unterverzeichnisse sind gemeint („Suh- 
Directories" in Basic German). Nichts liegt also näher, als auch im Unit-Verzeichnis damit klar Schiff 
zu machen... 

Das Problem: woher soll MaxonPASCAL wissen, wohin es Units schreiben bzw. von wo lesen soll? 
(Naive Menschen glauben immer noch, mit einem Computer Probleme lösen zu können. In 



9. Units und Modulc 


213 


Wirklichkeit zieht die Anschaffung eines Computers generell unzählige Probleme mit sich, von 
denen man vorher nicht einmal zu träumen gewagt hätte...) Aber Sie haben Glück; in diesem 
Allschnitt erfahren Sie nicht nur das Problem, sondern auch die Lösung (U'owl), und zwar genau 
jetzt (Oh yeah!'): 

Zunächst müssen wir unser Unit ja in ein Utiteiverzeichnis schreiben.Daz.u dient die Contpilcr- 
Oirective Jproject“, die man an beliebiger Stelle im Unit-Quelltext unterbringen kann, z. B. so; 

{$projeGt MatheTools } 

Der Projektname muß fonnal ein Bezeichner sein itnd ist die Bezeichnung des Unten'etz.ichnisses, 
in dem das Unit abgelegt werdeti soll. Dabei wird das entsprecbende Verzeichnis automatisch ange¬ 
legt. 

M:tn kann aber natürlich auch „manuell“ in Ihrem Unit-Directoiy solche Subdirectorv's anlegen und 
Units dort nachträglich ablegen. In Progratnmen und Modulen darf man „fproject" zw'ar auch ver¬ 
wenden, tiber es hat dort keinerlei Wirkung. Als Abkürzung kann man auch „$pro“ oder alles, was 
mit „fproj“ anfängt, schreiben. 

Um ein Unit aus einem Untcnerzeichnis des IJnit-Ver/eichnisses zu benutzen, setze man einläch ein 
„PROM <Name>“ vor die Uses-Zeile, z. B. .so; 

OSES Intuition, Graphics; 

FROM MatheTools OSES LongMath, Matrix; 

FROM Windows OSES PASCALCrt; 

OSES Printer; 

Mit diesen Zeilen werden die Units „Intuition", „Graphics“ und ,,Printer“ aus dem Unit- 
Hauptdirectrtry sowie ..LongMath“, „Matrix" itnd „PASCAI.Cif' aus den Unterverzeichnissen 
„MatheTools“ bzw. „Windows“ gelesen. Das FROM bezieht sich also immer nur auf das nächste 
USES. 

Für Modula-ll-Kenner; Die Ma.xonPASC.AL-Zeile 

FROM XXX USES yyy; 

hat nichts mit tier Modula-.AtiWeisung 

FROM XXX IMPORT yyy; 

ZU tun! Ersteres importiert ein ganzes Utiit aus einem Subdirectoiy, letzteres einen einzigen 
Bezeichner aus einem Modul. 


9.12.2 Organisation von Projekten 

Units dienen zwei verschiedenen Zwecken; Wie Sie sich Bibliotheken mit öfter benutzten 
Prozeduren und Funktionen aniegen können, wissen Sie bereits. .Aller Sie können mit Units auch 
modular programmieren, Lind zwar komfortabler als mit MODULEn - wenn auch mit ein paar klei- 



MaxonPASCAl. 


214 


nen Einschränkungen. Formal besteht natürlich keinerlei Unterschied zwischen „Bibliotheks“- und 
„Modtil“-Units, erstere werden eben von vielen verschiedenen Programmen benutzt, während letz¬ 
tere speziell für ein Programmprojekt geschrieben werden. Trotzdem will ich hier einige Tips für die 
Realisierung umfangreicher Programmprojekte unter Benutzung von Units geben. 

Als erstes sollte man sich einen Namen für das Projekt ausdenken, denn Units, die nur in diesem 
einem Programm benutzt werden, haben im Unit-Hauptvcrzeichnis nichts zu suchen. Auch für die 
Quelltexte ist entweder eine neue Diskette zu formatieren oder ein eigenes Unterverzeichnis anzu¬ 
legen. 

Der nächste Job ist schon etwas anspruchsvoller: Man muß ein gewisses Konzept entwickeln, nach 
dem man sein Projekt in Units unterteilen will. In der Regel fallen einem bei großen Programmen 
sofort gewisse Funktion,sgruppen auf, die weitgehend unabhängig voneinander arbeiten. 

Ein Dateiprogramm könnte man zunächst in folgende Units aufteilen; 

• Festlegen der Eingabemaske 

• Eingabe eines Datensatzes 

• Lesen und Schreiben einer Datei 

• Prozeduren zum Drucken von Listen usw. 

Jedes dieser Units könnte man noch weiter verfeinern. Das sollte man aber nicht unbedingt über¬ 
treiben, z. B. nicht für jede Prozedur ein eigenes Unit. Ein einzelnes Unit sollte zweckmäßigerweise 
nicht mehr als etwa 1000 Zeilen Quelltext umfassen. 

Beim Entwurf dieses Konzeptes ist zu beachten, daß Units sich nicht gegenseitig benutzen können, 
hier also eine strenge Hierarchie besteht. Deshalb wird man des öfteren mehreren der Hauptunits 
ein gemeinsames Unterunit zuordnen müssen. Oft ist es sogar zweckmäßig, ein Unit namens 
„Global“ (oder so) zu schreiben, das globale Definitionen (Variablen, Datentypen...) des Programms 
enthält und von allen anderen Units benutzt wird. 

Dann brauchen Sie noch ein Hauptprogramm. Es sollte aus gewis.sen Gründen (nicht 
Gewissensgründen) so kurz wie eben möglich sein, im Extremfall beispielsweise bloß ein Unit 
„Haupt“ über USES einbinden und daraus eine Prozedur namens „Hauptprogramm“ aufrufen, der 
ganze Rest könnte d:mn in jenem Unit passieren. 

Ein Programm (in diesem Kapitel heißt das immer: „ein riesiges Programmprojekt“) schreibt man 
natürlich nicht einfach so ‘runter. Vielmehr muß es immer wieder getestet, erweitert, getestet, 
erweiten, getest... werden. Wenn Sie aber versuchen, ein Unit zu starten, wird es übersetzt, der 
Code ins Unit-Verzeichnis geschrieben und die monotone Meldung „Can’t run a unit!“ ausgegeben - 
auf gut deutsch: Ein Probelauf eines Units ist nicht möglich. Deshalb braucht man das 
Hauptprogramm, und deshalb sollte es auch möglichst kurz sein: Immer, wenn man ein Unit geän¬ 
dert und compiliert hat, muß man das Hauptprogramm durch den Compiler jagen, so daß man das 
gesamte Programm mit dem geänderten Unit ausprohieren kann. 

Es wäre ein unzumutbarer Arbeitsaufw'and, wenn man dazu jedesmal erst den Quelltext des gerade 
bearbeiteten Units abspeichem und das Hauptprogramm in den Editor laden müßte. Einfacher geht 



9. Units und Module 


215 


es, wenn man das Hauptprogramm extern übersetzen läßt, also mit dem Menü „Starten/Compile 
Datei“ oder dem entsprechenden Tastaturmenü. Auf diesem Wege kann man übrigens auch Units 
übersetzen, die wegen eines Prüfsummenlehlers neu compiliert w'erden müssen. 

Noch komfortabler wird es aber, wenn man die Quelltextdatei des Hauptprogramms als „Main File 
bzw. „Hauptdatei“ definiert. So eine Datei wird immer, nachdem aus dem Editor ein Unit compiliert 
wurde, extern übersetzt untl gelinkt. Also wird nach jeder Änderung eines Units das 
Gesamtprogramm neu erstellt und kann getestet werden. 

9.13 Assembler und PASCAL 

Es gibt Tage im Leben eines Programmierers, da kann man es einfach nicht vermeiden, ein 
Unterprogramm in Assembler zu schreiben; sei es nun aus Geschwindigkeitsgründen oder bei 
maschinennahen Problemen (versuchen Sie 'mal, einen Exceptionhancller oder Interruptserx'er in 
P.ASCAl, zu schreiben...). Der MaxonPASCAL-Unker bindet nicht nur PASCAL-Module zusammen, 
sondern kann auch A.ssemblerroutinen einlinken. 

Prinzipiell können Sie jeden .Assembler benutzen, der Alink-kompatible Objektdateien erzeugt (also 
fast jeden). Ich empfehle natürlich den MaxonASM. 

Assemblerroutinen werden genau wie PASCAL-.Module eingebunden. Sie können auch umgekehrt 
vom MaxonASM aus das PASCAI.-Hauptprogramm einlinken, indem Sie das entsprechende 
Objectfile und die Laufzeitbibliothek „paslib.o“ hinzulinken. 

Ein Unterjrrogramm wird aus dem .MaxomASM exportiert, indem man das Label am Anfang der 
Routine als ,acdef‘ deklariert. Auch Variablen kann man auf diese Weise zwischen der Assembler- 
Routine und dem PASCJ\L-Programm austau.schen, 

Ein Programmfragment als Beispiel; 

Program PASCAL„meets_ASBenibler; 

Var a, b: integer; EXPORT; 

X: Longint; IMPORT; 

Procedure Assi; IMPORT; 

Begin { Hauptprogramm } 
a:= 42; 
b:= 17; 

Assi; 

writelnt a:10,b:10,x:10) 

End. 

Ein geeignetes MaxonASM-Programm dazu: 

xdef a,b,x,Assi 
xref .main 

jmp _main ; Einsprung ins Hautprogramm 


Assi: 


move.w a,dO 
move.w b,a 



MaxonPAS(]Al. 


216 


; Werte von “a" und "b" vertauschen 
; Produkt a*b berechnen 
; ... und in x ablegen 

; zurück ins PASCAL-Programm 

; Langwort-Variable, wird erportiert 

Dieses Programm macht nicht viel Tiefsinniges: Zwei INTEGER-Variable werden initialisiert, eine 
Assembler-Routine, die die Variablenwerte vertauscht untl das Produkt in einer LONG-Variablen 
ablegt, wird aufgerufen, untl am Ende werden alle drei Variablenwerte ausgegeben. 

Wie kann man nun eine Parameterübergabe realisieren? Es gibt natürlich - wie in obigem Beispiel - 
die Möglichkeit, die Parameter in gemeinsamen Variablen abzulegen. Wenn Sie einer importierten 
Routine wie einer PASC.Al.-Prozedur Parameter übergeben, liegen diese direkt oberhalb der 
Rückkehradres.se auf dem Stack (also ab „4{a7)“), wobei die einzelnen Parameter in ihrer normalen 
Reihenfolge auf den Stack geschoben wurden, ,sü daß also der erste Parameter an einer höheren 
Speicheradresse steht als der zweite. 

Dei Rückgabewert von Functions ist stets im Register dO zurückzugeben. Ist er vom 64 Bit breiten 
Typ „LongReal , so ist er in dO und dl abzulegen. Der Wert des Adressregisters a5 darf in der 
Assembler-Routine nicht verändert werden, davon abgesehen stehen Ihnen alle Register zur 
Verfügung. 

Einfacher geht die Parameterübergabe aber, wenn Sie im PASCAI.-Programm „External“ statt 
..Import schreilxtn. Die Wirkung ist eigentlich die,selbe; wenn ater ein Parameter einen 
Registernamen wie „dO oder „a3“ tragt, wird der Wert vor dem Unterprogrammaufaif in das ent¬ 
sprechende Register geladen. Bei VAR-Parametern erhält das Register die Adresse der referierten 
Variablen, bei nichtskalaren Value- Parametern (z. B. Arrays) ist das Ergebnis Undefiniert. 

Die Paiameterübcigate in Registern hat atif die Laufzeit übrigens keine Auswirkung, denn die 
Parameter werden zuerst wie gewohnt auf den Stack gelegt und erst dann in die Register geladen. 
W'enn ein formaler Parameter keinen 6800ü-Regi.stei namen trägt, wird er auch nicht in ein Register 
geladen, liegt ater wie gewohnt auf dem Stack. 

Die Assembler-Unterroutine kann wie ein Mixlul mit der Anweisung „{Jlink 'xxx'}“ in das PASCAI.- 
Programm eingcbuntlen werden. Dann haben Sie aber möglicherweise Probleme mit tiem Pfatl, der 
sich beim Aufräumen auf der Diskette ändern kann. Deshalb gibt es alternativ zu „link“ noch die 
„ulink“-Anweisung. 

Beispiel: 

{$ulink "Assemblerteil.o" ) 

Jetzt wird die angegebene Datei aus dem Unit-Verzeichnis gelesen. Auch hier können Sie 
L.'nterv'ei7eichnis,se angeben (analog zum „PROM“ bei Units): 

{$ulink "ABsemblerzeugs/Test.o" } 


move.w dO,b 
muls a,dO 
move.1 dO,X 
rts 

x: blk.l 1 



9. Units und Modulc 


217 


„ulink“ hat noch einen weiteren Vorteil ge}>enüber „link“: Bei Angabe zweier Unit-Pfade kann man 
mit „ulink“ wie bei Units ein Puffern der Objektdateien in der RAM-Disk erreichen. Dann müssen Sie 
aber aufpassen, wenn Sie gleichzeitig in PASCAl. und Assembler programmieren und eine 
Assembler-Objektdatei ändern: vergessen Sie nicht, die neue Version der Objektdatei in BEIDEN 
Unit-Verzeichnissen abzulegen, damit MtixonPASCAL sie auch sicher findet. 

Stehen „$link“ und „$Lilink“ im Interfäceteil eines Units, so werden sie auch in die Interfacedatei 
übernommen, so ilaß die Dateien dann beim „USES“-Aufruf des Units automatisch eingeladen wer¬ 
den. 




10. Projekn-erwaltunR • MAKE 


219 


10. MAKE - die integrierte Projektverwaltung 

10.1 Das Prinzip 

10.1.1 Wozu eine Projektverwaltung? 

Größere Projekte bestehen nornialeweise nicht aus einer einzelnen Quelltextdatei, sondern aus 
einer Vielzahl von Modulen, die vom Linker verbuiulen werden - zumindesten.s sollte es so .sein. Das 
nimmt leicht Ausmaße an, die nicht mehr ganz leicht zu überschauen sind. Hinzu kommt, daß es 
natürlich Unsinn ist, nach jeder Änderung das ganze Projekt zu übersetzen. Auf die Dauer wird es 
aber lästig, sich immer wieder neu zu überlegen, w'elches .Modul jeweils übersetzt werden muß, ein¬ 
mal ganz davon abgesehen, daß man eigenartige Überraschungen erleben kann, w-enn man dabei 
etwas vergißt. So entsteht das Bedürfnis, solche Vorgänge zu automatisieren - wozu hat man 
schließlich einen Computer... 

Die populärste Projektverwaltung, die auf so ziemlich allen ernstzunehmenden Rechnern anzutref¬ 
fen und bei allen Compilersirrachen tausendfach bewährt ist, heil.^t „make“. Eigentlich ist „make“ 
selbst eine .Art Pmgramnriers|rrache, und das macht es natürlich nicht leicht, ein komplettes .Make in 
eine graphisch orientierte Entwicklungsumgebung w'ie die von MaxonPASCAL zu integrieren. 
Deshalb unterstützt MP.A.SCAL nur einen recht begrenzten (aber den enuscheidenden) Teil von 
„make". Außerdem beschränkt „Make“ sich auf Projekte, die aus einem Hauptprogramm und eini¬ 
gen Modulen Irestehen. Durch Units hierarchisch gegliederte Projekte werden also nicht unter¬ 
stützt, auch wenn man natürlich in seinem Projekt auch Units benutzen und dazulinken kann. Units 
werden aber - im Gegensatz zu Modulen - nicht von der Projekwerwaltung automatisch compiliert. 


10.1.2 Was ist das überhaupt - ein Projekt? 

Fangen wir doch einmal ganz, graswurzelmäßig von vorn an: Woraus besteht ein Projekt (immerhin 
w'ar von einer Projekt-Verw'altung die Rede) - unti was ist überhaupt ein Projekt? 

Also, zu den oben erwähnten Einschränkungen gehört, daß ein Projekt immer genau ein ausführba¬ 
res Programm darstellt. W'enn man im Rahmen eines Projekts ein Programm in mehreren Versionen 
erstellen will, muß man eben für jedes einzelne Executable eine eigene Projektdatei erstellen. 

OK - ein Projekt ist also ein ausführbares Programm. Und wie kommt man zu einem solchen 
Programm, sofern es sich nicht gerade um ein Ifonsai-Miniatur-Projekt handelt? 

Richtg, das erwähnte ich schon; Man linkt dafür Objektdateien, also .Module, zu.sammen. 
Genaugenommen bindet der Linker auch noch fertige Bibliotheksmodule ein, aber das interessiert 
uns hier nur höchst periphär, oder genaugenommen nicht die Bohne. Der Freizeit-Existenzialist 
stellt sich jedenfalls nun die Frage „Und wo kommen die kleinen Module her?“, der Coder weiß es 
schon: Das hat ausnahmsweise nichts mit Schweinskrams zu tun, sondern die Objektdateien wer¬ 
den von irgendwelchen Compilern erzeugt. 



MaxonPASCAl, 


220 


Zu jedem der M(xlule gibt es genau einen ganz besonderen Quclltext, nämlicli den Text, aus dem 
die Ohjektdaiei durch Cojtipilieren entstein. Um so ein Objekt zu machen, braucht die 
Projektverwaltung also iin wesetitlichen eine Information darüber, wie der Quelltext dazu heißt, und 
außerdem noch ein paar Zusatzinformationen, etwa den Namen des Compilers oder irgendw'elche 
der allseits beliebten Compiler-Optionen. 

Aller das ist noch lange nicht alles, denn zu einem normalen Projekt gehüren noch einige Texte 
tnehr - normalerweise Intiudedateien, die von tien eigentlichen Quelltexten irgendwo und irgend¬ 
wie benutzt werden. Das fühn uns natürlich zu der Frage, wann und wie eine Objektdatei neu über¬ 
setzt wird. Nun, bevor wir alle iti Rente gehen, werden wir vielleicht noch das Entwicklungssystem 
erleben, das Programme on-line compiliert, während man den Quelltext bearbeitet. Vorerst ist es 
jedenftills noch so, daß man munter an seinen Quelltexien 'nimediert und irgendwann entscheidet, 
daß das Programm für eine erneute Übersetz.ung reif ist. Dann tritt die bereits mehrfach erwähnte 
Projektverwaltung „.Make“ in Aktion und schaut nach, welche Objektdateien ftir das Projekt nötig 
sind, und bevor diese zusammengclinkt w'erden, denkt es scharf darüber nach, welche der 
Objektdateien neu übersetzt („recompiliert“) werden muß. Da ja der Com]hIer wenigstens zeitweise 
mit dem Programmierer Schritt halten soll, ist auch noch halbwegs einsichtig, wann das zu gesche¬ 
hen hat: Richtig, genau dann, wenn mindestens einer der Texte, aus denen das .Modul entsteht (d. 
h. Quelltext und Indude-Files), seit der letzten Übersetzung verändert wurde. Das läßt sich leicht an 
Erstellungsdatum und -uhrzeit der entsprechenden Dateien feststellen. 


10.1.3 Was hat das ganze mit „Make" zu tun? 

Die Projektvenvaltung verwaltet itn wesentlichen zweierlei Datenbestände: Texte und Objekte. Bei 
den Te.xten handelt es sich im allgemeinen um irgendwelche Quelltexte oder Indudedateien, und 
aus diesen Texten erzeugt der Comitiler unter der Kontrolle der Prujektvenvaltung die 
Objektdateien. Im letzten Schritt werden diese übjektdateien dann mit den Libraries zu einer aus¬ 
führbaren Datei gelinkt. 

Für jede der Objektdateien braucht das Make also Angaben darüber, wie es „gemacht" (daher der 
Name) werden soll, insbesondere den Namen eines Quelltexts und eines Compilers. Das wmrde 
man natürlich auch noch von Hand hinkriegen, und deshalb sagt man der Projektverwaltung atich, 
unter welchen Umständen ein Objekt compiliert w'erden soll und wann die alte Version noch einmal 
verwendet werden kann. 

Wie bereits gesagt, muß ein Objekt neu übersetzt werden, wenn ein Text, der mit diesem Objekt zu 
tun hat, verändert wurde. Normalerweise handelt es sit:h bei diesen Texteti um den Quelltext des 
Moduls sowie die darin benutzten Indudedateien. Dazu vergleicht Make tIen Datestamp, also die 
Zeit der letzten Veräntlerung einer Datei, der Objektdatei mit denen „ihrer“ Texte, Natürlich wird 
ein Objekt auch dann compiliert, wenn es bisher noch nicht existierte. 




10. Prujcktvcmaltung - MAKli 


221 


10.2 Die Praxis 

10.2.1 Erstellen von Projekten 

;\lle .Angaben über die Struktur eines Projekt,s werden sinnvollerweise in einer Datei festgehalten, 
dem Makeille. Mit M;rxonPASC4L erstellen Sie diese Datei interaktiv mit dem Pull-Down-Menü 
„Make“ und dem Make-Dialoglenster. Das Makefile wird dabei ständig aktualisiert, also nach jeder 
Veränderung neu abgespeicheit, Da eine solche Datei nomtalerw'eise nicht sehr lang sein wird, dürf¬ 
te dabei auch beim Diskettenhetrieb keine Ver/hgerung auftrelen. 

Am besten probieren Sie das Make-Utility einfach aus, indem Sie sich ein Mini-l'rojekt aus zwei 
Modülchen erstellen. Damit fangen Sie an, indem Sie tlen Menüpunkt „Neues Makefile“ anwählen. 
Wenn bisher keine Projektdatei geladen ist, können Sic ebenso gut auch den Menüpunkt 
„Projektverwaltung“ benutzen. Nun er,scheint tler Fileretjuester und fragt Sie nach dem 
gewünschten Dateinamen, Meist nennt man tlie Datei ganz einfach „makefile“, jedenfalls dann, 
wenn man nicht mehr als eine solche Datei in einem Verzeichnis hat. Wenn Sie dagegen an eitlem 
vorhandendem Projekt Weiterarbeiten w'ollen, benutzen Sie den Menüpunkt „Makefile laden“. 

Nach dem F-rzeugen einer neuen Projekttkitei öffnet sich ein Fenster, das zwei Scrollisten (eine mit 
..Objekt-Dateien“, die andere mit „Quelltext-Dateicn“ betitelt) und eine ganze Menge Gadgets ent¬ 
hält. Klicken Sie hier am besten einfach auf tias Gadget „Fertig" in der rechten unteren Ecke, um 
das Fenster wieder zu schlieKen, 


g I MaxoiiP^WtMl Make 




igj; 


ObJ«kt i«n: 

B nalO.o 
n«i V« Its . 0 


A| vj l ffnäHnV 
Hinauf 


I 






Sh«# 

r 


irtfo 
Anall 
Anal!,irrft» 
Anall o 
Ariall.|) 
Analip.ihfo 
AnaiOp 
AnalOp 
AnalOp hfu 
An«^rä.o 

An^ttsp,Bifü 

Makcfito 


Wuraal 


Vatar 


j. 


Qu« 11 foKt *'P'ait« I «n: 


(Rnali.p 


I 


HinaufUg«n. 
»w»nn»n. 




48 

47712 


issoe 

12238 


El 87 


3de 

8S| 


Boom 


V©r2eichrt3t fWerka ;MaxonPa3c#l3/DCMO/Ar^ealCf 11 / 
Datei; tAMiy»i8.p ^ 

achtbar; | ' | var»tect;t U ~ 

OK liiitiii&iMitiiwatii AfitajEfc-li 


->al 




In Editor 

t.«d«n-»8€hi 


" I . 




e»'p' Xhen 


ap:«pti(b)i 

aip<pf Then. wtiteJP ; 

InFix:(b‘' opl, apH 

writ6P(b''. namoy. InFlx^b’' opS^ap+l)? 
IP apepE Tben vritaP •‘> 

Baiätn writePIt<b''.vaXue.O) , VcltePC' ') E 
Begln 

^iritaPunlcMafte (b'', nafte) ; 

If (pcl<b'' opl>>“4) Änd Cb'- 
InPlxCb''. opli4> 

End 


PrqiectMahagar 


l/DEm/ftnaiy&aioi-n/nrtart.p 
7^t13/Br>aiV3i«t 6 rl I /flhaIO.p 


I 53 i I 

42 U 421 CfMOt 
253/ 233 cfwaV 



























MaxonPASCAl. 


222 


An einem Projekt, daß melir als einen Quelltext umfaßt, wird man in der Regel länger als einen Tag 
lang arbeiten. Deshalb sollten Sie die folgenden Tips beachten, um es dabei auf lange Sicht komfor¬ 
tabel zu haben: 

Zu jedem Projekt gehört ein eigenes Verzeichnis. Sie sollten also auf jeden Fall mit der 
Workbench oder Shell ein neues Lnterv-erzeichnis in Ihrem „PASCAL:"-Verzeichnis oder auch 
anderswo anlegen. 

i«' Wenn Sie MPASCAI. immer von tier Shell starten, sollten Sie vorher stets in das Verzeichnis 
wechseln, in dem das .Makefile liegt. Dadurch wird dies auch für MPASCAI. und Edward zum 
aktuellen Verzeichnis, und dadurch werden die SESSION-Dateien von dort gelesen bzw. dahin 
geschrieben. Insbesondere werden dann auch die Compiler-Einstellungen von MPASCAI. im 
passentlen Verz.eichnis abgelegt und beim nächsten Start von .MPASCAI automatisch wieder ein¬ 
geladen. 

r*' MPASCAI kann von der Workbench tlurch Anklicken des Makefile-Icons gestartet werden. Die 
Projektdatei wird dabei automatisch als solche erkannt und geladen (und nicht etwa als 
Textdatei in den Editor). Dabei wird das Vciv.eichnis, in dem das Makefile liegt, zum aktuellen 
Verzeichnis von MPASCAI und Edward, was wiederum erfreuliche Auswirkungen auf die 
Behandlung der SESSION-Files hat (siehe oben). 

Die bequemste Art, sich ein Projekt für MaxonPASCAI. einzurichten, geht deshalb so: 

1. Stellen Sie sicher, daß die Option „Icons erzeugen" eingeschaltet ist und daß ein geeignetes lee¬ 
res Verzeichnis für Ihr Projekt existiert. 

2. Erzeugen Sie in diesem Verzeichnis wie oben beschrieben eine Make-Datei, die Sie zunächst 
einmal so leer lassen, wie sie ist. 

3. Beenden Sie jetzt MPASCAI,. 

4. Wenn Sie Workbench 2.0 (oder später) benutzen, machen Sie jetzt am besten ein „leave Out“ 
(auslagem) des Makefile-Icons. Dadurch liegt es immer sichtbar auf dem Workbench-Bildschirm 
und kann nach dem Einschalten des Rechners sofort geöffnet w'erden. 

5. Starten Sie nun MPASCAI, indem Sie das Makefile-lcon (natürlich doppelt) anklicken. .Nun wer¬ 
den „Edward.SESSION“ und „mp.SESSlON“ automatisch aus dem Verzeichnis des Projekts gele¬ 
sen (bzw. dorthin geschrieben). 

Vielleicht erscheint Ihnen diese Prozedur etwas umständlich, aber auf die Dauer werden Sie es zu 
schätzen wissen, nach dem Booten des Rechners mit einem einfachen Doppelklick genau da Weiter¬ 
arbeiten zu können, wo Sie zuletzt aufgehört haben. 



10, Projcktverwaltung • MAKE 


223 


10.2.2 Hinzufügen von Dateien, umständliche Methode 

Zu einem Projekt gehört natürlich mindestens eine Objektdatei, und um eine solche zu erzeugen, 
braucht man einen Quelltext, Versuchen wir es zunächst auf die umständliche Methode und schrei¬ 
ben einen Text, z. B. 

iQodule testmodul; 
procedura teat; export; 
begin 

writeln('Dies ist ein Test.') 

end; 

begin 

end; 

Diesen Text speichern Sie einmal als „test.p“ ab (mit einer Datei ohne Namen kann Make nichts 
anfangen) und wählen ckmn den Menüpunkt „Make/Projektvemaltuog“. Damit öffnen Sie wieder 
das Make-Fenster, das Sie schon beim Erzeugen der Projektdatei gesehen haben. Dabei ist Ihnen 
vielleicht auch schon aufgefallen, daß das Fenster vertikal zweigeteilt ist, wobei die linke Hälfte mit 
„Objekt-Dateien" und die Rechte mit „Quelltext-Dateien“ überschrieben ist.Wenn Sie nun die 
Textdatei „test.p“ und die Objektdatei „test.o“ in Ihr Projekt aufnehmen möchten, geschieht dies 
eigentlich ganz intuitiv: Klicken Sie zunächst auf das Gadget „Hinzufügen... “ in der rechten Spalte. 
Es öffnet sich nun ein Datciauswahlfenster, in dem Sie die soeben erzeugte Datei „test.p“ anwählen. 
Sie bestätigen die Auswahl, der Filerequester wird geschlossen und schon steht „test.p“ in der rech¬ 
ten Liste des Make-Fensters. Eltenso einfach wältlen Sie jetzt das linke Gadget „Hinzufügen... “ an 
und wählen im Filerequester den Dateinamen „test.o“. Höchstwahrscheinlich existiert diese Datei 
noch überhaupt nicht, so daß Sie sie folglich nicht einfach anklicken können, sondern den Namen 
von Hand eintippen müssen. 

Natürlich spielt es keine Rolle, ob sie zuerst - wie hier beschrieben - die Quelltextdatei und dann die 
Objektdatei oder umgekehrt eintragen. Die beiden Listen sind zunächst vollkommen voneüiander 
unabhängig, und wenn Sie möchten, können Sie jetzt auf beiden Seiten beliebig viele Dateien ein¬ 
tragen, die allesamt auf der Platte vorhanden sein können, aber nicht müssen. Die Dateien müssen 
auch keineswegs im selben Verzeichnis wie die Make-Datei liegen, aber das ist allgemein üblich und 
wohl auch am praktischsten. 

Wenn Sie jeweils mehrere Dateien aufnehmen, wird Ihnen auffallen, daß die Namen der Quelltext- 
Dateien alphabetisch sortiert werden, während die Objektdateien in der Reihenfolge erscheinen, in 
der Sie hinzugefügt werden. Dies ist auch die Reihenfolge, in der der Linker später die 
Objektdateien aneinanderhängt, was z. B. dann von Interesse ist, wenn man einen eigenen Startup- 
Code schreiben möchte. Die Reihenfolge der Objektdateien können Sie mit den beiden Pfeilgadgets 
links von der Anzeige für die angew'ählte Objektdatei verändern. 

Dumm wie Computer nun einmal sind, müssen Sie nun aber aut:h noch klarmachen, daß die 
Ohjekidatei „test.o“ entsteht, indem „test.p“ com[)iliert wird. 'Wählen Sie dazu „test.o“ in der linken 
Spalte an (so daß der Name invertiert dargestellt wird und in der Anzeige unter der Objekt-Liste 



MaxonPASCAL 


224 


eischeint) und klicken Sie dann auf das Gadget „Compilcr-Anw.". Alternativ können Sie „test.o“ 
auch mit einem Doppelklick an wählen, 

Nun öffnet sich ein neues Fenster, in dem alle Gadgets bis auf ein Cycle-Gadget oben links und die 
üblichen „OK“- und „A6fcr«c/j‘‘-Gadgets am unteren Rand deaktivert sind. Das Cycle-Gagdet zeigt 
zunächst ,Mcbt übersetzbar“ an. Nach einem Klick erscheint Ua „intern compilieren“, und 
alle Gadgets bis auf ein Stringgadget unten links werden gleichzeitig aktiv. Insbesondere kann jetzt 
auch die mit „Quelldatei“ überschriebene Liste benutzt werden. Dort wählen Sie jetzt einfach 
„test.p“ als Quelltext an und schließen das Fenster wieder mit einem Klick auf„0/f“. 

Im Make-Fenster erscheint jetzt direkt unterhalb der Objekt-Liste „pc -c test.p“. Dies ist eine Pseudo- 
Anweisung, mit der man in der Shell „test.p“ nach „test.o“ übersetzen würde, wenn MaxonPASCAL 
keine integrierte Entwicklungsumgebung hätte. 


10.2.3 Übersetzen des Projekts 

Sie können das Programm jetzt compilieren, indem Sie entweder im Make-Fenster auf das Gadget 
„Make“ klicken oder wie gewohnt im Editor die Taste <F9> bzw. das Menü „Compiler/Überset¬ 
zen“ anwühlen. Nun tritt Make in Aktion, stellt fest, daß „test.o“ compiliert werden muß, und bindet 
anschließend aus diesem Objectfile ein Programm zusammen - oder versucht es zumindest, denn es 
gibt ja noch kein Llauptprogramm. Make funktioniert völlig unabhängig davon, welcher Text sich 
gerade im Editor befindet. 

10.2.4 Hinzufügen von Dateien, einfache Methode 

Beim folgenden Miniatur-Modul, welches das noch fehlende Hauptprogramm enthält, machen wir 
es uns etwas einfachen 

program haupt; 

{$incl "test.h"} 
begin 

test ; 

end. 

Diesen Text speichern wir einfach als „main.i)“ ab und wählen den Menüpunkt „Text und Objekt 
aufinehmen“. Jetzt macht Make vollautomatisch folgendes: 

f»' Die Datei „main.p“ wü-d in die Liste der Texte aufgenommen. 

'H'’ Das Objekt „main.o“ wird dem Projekt hinzugefügt. 

»»■ Die Compileranw'eisung für „main.o“ w'ircl passend gesetzt. 

Jetzt fehlt dem Projekt nur noch eins: Die Header-Datei „test.h", in der die Funktionen (na ja, hier 
ist es ja nur eine) des .Moduls „test“ deklariert. 

Die Datei test.h enthält folgende Zeile: 



It). Projektverwaltung ■ MAKE 


225 


procedure test; Import; 

also (len Prototypen der Funktion. So, wenn Sie jetzt den Compiler starten, müßte das Projekt kor¬ 
rekt übersetzt und gelinkt werden. 

Zuvor sollten Sie aber „test.b“ notb als Quelltext dem Projekt binzufügen (im folgenden Abstbnitt 
verrate ich Ihnen auch, wozu tkb gut sein soll). F)as können Sie wie gehabt vom Make-Fenster aus 
erletligen. Wenn Sie die Datei aber sowieso gerade im Editor haben, können Sie auch den 
Menüpunkt „Make/Text aus Editor aufnehmen“ benutzen, und schon wird der aktuelle Text des 
Editors in tlie Quelltext-Liste aufgenommen. 

10.2.5 Abhängigkeiten 

Das so ziemlich wichtigste Feature tler Projektverwaltung haben wir aber bisher nicht benutzt: Die 
Mrhiingigkeiten. Offensichtlich benutzt in unserem Beispiel „main.o" die Datei „test.h“ als 
Inckuledatei und Ist folglich davon abhängig. Immer, wenn „test.h“ verändert wurde, sollte deshalb 
auch „main.o“ sicherheitshalber neu übersetzt werden. 

Öffnen Sie also wieder das Make-Fenster, wählen Sie in der linken Liste die Objekttlatei „main.o“ an 
und klicken Sie dann auf das Gadgct „Abhängigkeiten“. Dabei werden Sie bemerken, daß dieses 
Gadget invertiert bleibt, bis Sie es erneut anklicken. Nun können Sie in der Quelltext-Liste alle die 
Dateien anwählen, von denen „main.o“ abhängig sein soll, also insbesondere „test.h". 
Korrekterweise können Sie auch „main.p“ anwählen, aber bei interner Übersetzung weiß 
M;ixonPASC.\L von selbst, daß jede Objektdatei von ihrer Quelltextdatei anbängt. Jedenfalls worden 
Sie dabei merk, daß Sie jetzt in der rechten Spalte beliebig viele Zeilen gleichzeitig aktivieren und 
durch erneutes .Miklicken wieder deaktiveren können. Die.ser Modus bleibt erhalten, so lange das 
Gadget „Abhängigkeiten“ invertiert ist. Sie können jetzt auch ganz einfach auf eine andere 
Objektdatei klicken, um deren iMahängigkeiten zti betrachten und zu manipulieren. 

Im Grunde genommen ist dieses manuelle Setzen von Anhängigkeiten aber überhaupt nicht nötig. 
Es reicht völlig, wenn Sic im System-Dialogfenster (Menüpunkt „Optionen/Systeni“) das vielver¬ 
sprechend mit „Make-Datei: Abhängigkeiten automatisch setzen“ beschriftete Symbol 
anw'ählen. Wann immer nun eine Objektdatei des Projekts compiliert wird, merkt MPASCAI. sich, 
welche Includedateien dabei gelesen wurden - natürlich nur die selbstgeschrietenen aus dem aktu¬ 
ellen Verzeichnis und nicht etwa die System-lncludes, die über den im Compiler-Requester angege¬ 
benen Pfad eingebunden werden. 

Anschließend werden die Alahängigkeiien der jeweiligen Objektdatei automatisch gesetzt, wobei 
nötigenfalls sogar neue Textdateien in das Projekt aufgenommen werden. 

Deshalb beschränkt sich das .Atilegen eines Projekts zusammengefaßt auf folgende Schritte: 

Eraeugen sie eine neue Projektdatei. 

•• laden Sie alle „echten“ Quelltexadateien, also keine Includefiles, einmal in den Editor und 
wählen Sie dann den Menüpunkt „Text und Objekt aufnehmen“. 



MaxonPASCAL 


226 


Stanen Sie die Übersetzung, wobei Sie sieherstellen sollten, daß die Objektdateien allesamt 
noch nicht existieren. Dann werden selbsttätig alle Quelltexte durchcompiliert, die 
Inciudedateien in das Projekt aufgenommen und die Abhängigkeiten korrekt gesetzt. 

10.2.6 Weitere Funktionen im Make-Fenster 

10.2.6.1 Projektpflege 

Es kommt hin und wieder vor, daß eine Quelltext- oder übjektdatei komplett überflüssig wird. 
Dann wählen Sie die betreffende Datei einfach auf der richtigen Seite des Make-Fensters an und 
klicken auf das Gadgct „Entfernen“ .Nach einer Sicherheitsabfrage wird die Datei vollständig aus 
dem Projekt entfernt. 

Ebenso kann es passieren, daß Ihnen ein Dateiname plötzlich nicht mehr ganz passend erscheint. 
Dies können Sie elegant erledigen, indem Sie den Dateinamen im Make-Fenster anklicken und dann 
das Gadget „Umbenennen...“ benutzen (aber bitte das auf der richtigen Seite, denn auch diese 
Funktion gibt es gleichermaßen für Objekt- und Quelldaieien). Es erscheint der übliche 
Filerequester, dem Sie nun den gewünschten neuen Namen anvertrauen. Beachten Sie aber bitte, 
daß tliese Funktion die Datei ausschließlich in der Make-Datei umbenennt. Das eigentliche 
Umltenennen der Datei auf der Festplatte bzw. Diskette müssen Sie .schon .selbst erledigen. 

10.2.6.2 Übersetzung erzwingen 

Eigentlich entscheidet das Make ja .selbständig und prinzipiell auch korrekt, welche Datei w'ann 
recompiliert werden soll. Manchmal möchte man dies aber auch erzwingen, z. B. wenn man 
Compileroptionen verändert hat und einige txler alle Objektdateien gezielt mit diesen neuen 
Optionen übersetzen lassen möchte. Deshalb gibt es im Make-Fenster das Gadget ..Markieren“. 

Ähnlich wie „Abhängigkeiten“ ist auch „Markieren“ ein Umschaltbares Gadget. WährentI es akti¬ 
viert ist, können Sie in der Objektliste beliebig Dateien anwählen und deaktivieren. Beim nächsten 
Übersetzungsvorgang werden die so markienen Dateien dann auf jeden Fall compiliert, und zwar 
zusätzlich zu den Dateien, die Make ohnehin für übersetzungswürdig befindet. 

10.2.6.3 Dateien in den Editor laden 

Beim Programmieren hat man es fast immer nur mit den Textdateien zu tun, die zum aktuellen 
Projekt gehören. Deshalb bietet MPASCAL eine elegante Möglichkeit, Quelltexte in den Editor zu 
laden. 

Öffnen Sie dazu das .Make-Fenster und wählen Sie in der rechten laste den gewünschten Quelltext 
an. Wenn Sic nun das Gatlget „In Editor laden“ anklicken, wird der Text - wer hätte das gedacht - 
in den Edward hinzugeladen. Das GädgeX„Laden+Schließen“ funktioniert genauso, schließt aber 
gleichzeitig das .Make-Fenster. Dies können Sie auch mit einem Doppelklick auf den Dateinamen 
erreichen. 




10.2.6.4 Projektdatei wechseln 

Ani uiitei-en Rand des Make-Fensters belintlen sieh zwei bisher unerwähnte Gadgets; „Makefile 
laden“ und „Make verlassen“ Naheliegenderweise erscheint bei Anwahl des erstcren die Datei- 
Auswahlbox untl ermöglicht Ihnen, eine andere Projekttlatei zu laden. Mit dem anderen Gadget ver¬ 
lassen Sie den Make-Modus und gelangen wieder in die normale Betriebsart für Ein-Modul- 
Programme. 


10.2.7 Compileranweisungen für Objektdateien 

10.2.7.1 Interne Übersetzung 

Zwischen dem Compileranweisungs-Recitiester der Pntjektverwaltung und dem globalen Compiler- 
Dialogfenster besteht auch optisch eine gewisse Ähnlichkeit. Betrachen Sie einmal die Gadgets, die 
benutzbar werden, wenn für eine Objektdatei der Modus „Intern compilieren“ angewählt woirde. 
Sie werden feststellen, claK tlie wichtigsten Compileroptionen für jedes Motlul des Projekts separat 
eingestellt werden können. 



0 I WMm 




Then 


m vrifcePCM') 
.. ap) , 

maj i tnfixCb'^ 
>n weite?(')') 


D-IClhl Subranw* 

Indaxbaraich 

QHPafl IfrtackeroP« 
piPaH Arithn. «barlauf 
OlPafi Sani ho Ion naldan 
Oabuawar-Datal 
meid Bbb»fialwl«fc. aut. 


w&3.ue,0>; ¥rxteP<' '’i E 


itt (Ij'' ns»©) i 

And <b'',na»©<> 


Extarwa 


(Tlnin 

• P 







_T 

©Kt+ObJ 


All^cnifin gelten die globalen Einstellungen auch im Make-Modus, sofein eine Option nicht explizit 
anders eingestellt wird. Deshalb fmtien Sie im Compileranweisungs-Reciuester eine ganze Mengt 
kleiner Cycle-Gadgets mit den Stellungen „Def\ „Ein“ und „zl«s“. Dabei steht „Def ‘, wie man sief 
denken kann, für „Default“, d. h. bei dieser Schalterstellung soll für das Modul die globale 
Einstellung gültig sein. 







MaxonPASCAL 


228 


Bei den mit „Optionen überschriebenen Gadgets entsprechen die ersten sieben exakt den entspre¬ 
chenden globalen Schaltern. „Auto-Make“ entspricht einem Gadget aus dem „System“-Requester 
und legt fest, ob die Abhängigkeiten der betreffenden Objektdatei vom Make automatisch gesetzt 
werden sollen. 

Natürlich fehlen noch ein paar Compileroptionen, 2 . B. ist es über die Requester nicht möglich, für 
eine Übersetzungseinheit die Include-Pfade anders zu setzen. Solche (wohl eher ungewöhnliche) 
Einstellungen sind aber möglich, wenn Sie die Projektdatei in den Editor laden, „von Hand“ veiän- 
dern, abspeichern und dann erneut als Makedatei laden. In Abschnitt 3.3 erfahren Sie, wie die 
Projektdateien aufgebaut sind. 

10.3 Handgemachte Makedateien 
10.3.1 Die Grundlagen 

Das Format der Projektdateien von MaxonPASCAL orientiert sich an den Standard-Makefiles, ist aber 
natürlich etwas strikter, da in der integrierten Entw'icklungsumgebung ja nur ein gewisser Ausschnitt 
des Irekannten Make implementiert werden konnte. Es ist dadurch relativ leicht, ein solches 
Makefile von Hand zu erstellen oder ein vorhandenes Makefile an MaxonPASCAL anzupas.sen. Wenn 
Sie nicht in der integrierten MPASCAL-Umgebung arbeiten, sondern die Option „-m“ des mpc benut¬ 
zen, bleibt Ihnen sogar nichts anderes übrig, als Make-Dateien grundsätzlich manuell zu erstellen. 

Es gibt zwei verschiedene Arten von Zeilen, nämlich Abhängigkeits- und Anweisungszzeilen. Sie 
unterschieden sich formal dttdurch, daß letztere mit einem Leerzeichen oder Tabulator beginnen. 

Ein „Eintrag“ beginnt grundsätzlich mit einer Abhängigkeit.szeile, die dem Make sagt, w'as erzeugt 
werden kann und von welchen Dateien es abhängig ist. Optional können eine oder mehrere 
Anweisungszeilen folgen, die festlegen, wie das fragliche Objekt erzeugt werden muß. 


10.3.2 Der Linkeraufruf 

MaxonPASCAL eiwanet als ersten Eintrag stets die Exe-Datei, um die es geht (Sie erinnern sich: 
Leider immer nur ein Exefile pro Makefile). Die Exe-Datei ist - formal gesehen - von den 
Objektdateien abhängig, und erzeugt wird sie durch einen Linker-Aufruf. Als Linker muß hier der im 
mpc benutzt w'erden (auch wenn Sie nicht mpc, sondern MPASCAI. verwenden). In diesem 
Zusammenhang sollte ich wohl erwähnen, daß es für das Verständnis dieses Kapitels enorm hilf¬ 
reich w'äre, wenn Sie schon ein wenig mit dem mpc vertraut wären. 

Eine Abhängigkeitszeile beginnt stets mit dem Namen der zu erzeugenden Datei, gefolgt von einem 
und optional der Uste der .Abhängigkeiten. Wenn unser Projekt „Demo“ heißt und aus den bei- 
tlen Modulen „main.o“ und „test.o“ besteht, beginnt unser Makefile also mit den Zeilen: 


Demo: main.o test.o 
mpc main.o test.o -o Demo 



10. ProjcktvcrwaltunR- MAKE _ 

Dazu noch einige Anmerkungen: 

- Da das MaxonPASCAL Make keinen externen Linker aufruft, sondern alles implizit intern erle¬ 
digt, ist auch die Option „-o Demo“, die den Namen der Rxe-Daiei festlegt, strenf^enommen 
nicht erforderlich, zumal er aus der .Abhängigkeitszeile bereits bekannt ist. Aus Ästhetischen 
Gründen sollte man diese .Angabe aber trotzdem machen. 

- MaxonPASCAl, Make weiß, das ein Linkeraufruf von den benutzten Objektdateien abhängig ist. 
Deshalb sind auch die beiden Einträge in der Abhängigkeitszeile nicht wirklich nötig. 

ln der Linkeranweisung sind auch die benutzten Units mit der in Abschnitt 2.5.6i Option „-U“ auf¬ 
zuführen, da der Linker ja nicht wissen kann, welche Units für das Projekt benötigt werden. Dies 
entspricht den Textgadget „Makc-lJnits“ im Compiler-Requester. 

Beispiel: 

PC main.o test.o -o test -U printer -ü Windows/pascalcrt 


10.3.3 Internes Compilieren 

Nach dem Linkeraufruf folgen in beliebiger Reihenfolge die Einträge für die einzelnen 
Objektdateien. Wenn Ihnen danach ist, können Sie auch Einträge für Projektdateien hinzufügen, die 
überhaupt nicht zum Projekt gehören - die werden dann ignoriert. 

Auch hier beginnt jeder Eintrag mit einer Abhängigkeit.szeile, also z. B. main.o: main.p test.h 

Die Objektdatei „main.o“ soll also bitteschön übersetzt werden, wenn eine der Dateien „main.p 
und „test.h“ in letzter Zeit verändert wurde. Eehlt noch der Compileraufruf: Der Compiler heilst ja 
bekanntlich genau wie der Linker ..mpc' (oder auch „cp", siehe oben). Die Option ,,-c sorgt dafür, 
daß eine Objektdatei statt einer Exe-Datei erzeugt wirtL 

main.o: main.p test.h 
mpc -c main.p 

Außer „-c“ kann auch jede andere Compiler-Option aus Kapitel 2.5.6.6 benutzt werden, z. B. „-gB 
zum Einschalten der .Airbruchmöglichkeit. Bei allen Optionen, die nicht explizit gesetzt werden, wer¬ 
den die globalen Defaults verwendet. 

Es ist übrigens nicht zwingend erforderlich, dem Make zu sagen, daß ein Objekt von seiner 
Quelltextdatei (und das gesamte Projekt von seinen Objektdateien) abhängig ist, denn das weiß 
Make auch so. Also könnte man das Makefile folgendermaßen abkürzen: 

Demo: mpc main.o test.o 
test.o: 

mpc -c test.p 
main.o: test.h 

mpc -c main.p 



MaxonPASCAI. 


230 


10.3.4 Externe Übersetzung 

jede Compileranweisung, die mil „mpc" beginnt, wird von MaxonP.ASCAI. „intern“ ausgefiilin, d. h. 
Make und Compiler sind Bestandteile eines einzigen Programms und keines von beiden muK 
irgendwie nachgeladen werden. Leider ist MaxonRASüU, ziigegebenermafSen nicht ausreichend (z. 
B. hat man öfters ein Assembler-Modul in seinem Projekt). Alxtr auch das ist kein Problem: 
Schreiben Sie die Anweisung ganz einfach in das Makelile! Sie können dann sogar mehrere nachei¬ 
nender auszuführende Zeilen (=Shell-Aiweisungen) für eine Übjektdatei angeben, z. B. so: 

sub.o: Bub.asm 

mptbin/masm sub.asm -c clos echo "Assembler ist 
fertig" 

Wenn Sie diese Projektdatei von der integrierten Umgebung MRASCAI. ausführen lassen, wird vor¬ 
her sogar geprüft, ob die Dateien, von denen das Objekt abhängig ist (in diesem Falle nur 
„sub.asm ), sich im Ftlitor befinden und seit ihrer letzten Abspeicherung veränden wurden. Falls ja, 
werden sie automati.sch abgespeichert, denn der externe Compiler/Assembler liest seinen Quelltext 
ja aus der Datei und nicht (w'ie MaxonP.ASCAL) direkt aus dem Edward. 

Speziell bei der Benutzung des Mttxon Assemblers gibt es noch eine Besonderheit: Nach der Über¬ 
setzung schaut MPASCAI, nach, ob eine zur Objektdatei passende „.err''-Datei erzeugt wurde (im 
Beispiel also „sub.err"). Falls ja, versucht MPASCAl. diese als MaxonAsm-Fehlerdatei zu inteqrretie- 
ren und die Fehlermeldungen direkt im Compilerfenster anzuzeigen. Also wäre hier der Aufruf 
masm sub.asm -c clos -v sub.err höchst empfchlenwert. 

Noch einmal zurück zu den Mehrfach-.Aiweisungen: Wie gibt man die eigentlich in MPASCAL ein, da 
es doch im Compileranweisungs-Requester für externe Übersetzeraufnife nur ein Textgadget gibt? 
Nun, hier sind die Zeilen mit einem Gegenschrägstrich „\“ zu trennen. Davor und dahinter muß aus 
Gründen der Eindeutigkeit jew'cils ein Leerzeichen stehen. 


10.3.5 Weitere Features 

Bisher wurden die Grundfünktionen von Make erläuten, die vom internen Make direkt und sichtbar 
unterstützt werden. Es gibt aber noch eine ganze Menge zusätzlicher Features, die besonders dann 
von Interesse sind, wenn man seine Projektdatei für den CLI-Compiler meppe von Hand schreibt, 

10.3.5.1 Zeilenverbindung 

Die Anzahl der Dateien in einem Projekt wächst oft schnell an und mit ihr auch die Längen von 
Abhängigkeitszeilen oder Linkeraufrufen. Da z. B. Edward die Zeilenlängen auf 256 Zeichen 
beschränkt, stellt sich irgendwann das Problem, daß man mehr in eine Zeile packen möchte als 
eigentlich gesund ist. 

Die Lösung ist die Zeilenverbindung mit dem Gegenschrägsirich. Endet eine Zeile mit „V‘, so verbin¬ 
det Make sie mit der nächsten Zeile. Auf diese Weise können beliebig viele „echte“ Zeilen zu einer 
einzigen Make-Zeile zusammengefaßt werden. 



10. Projektverwaltung- MAKE 


231 


10.3.5.2 Kommentare 

Kommentare beginnen für Make mit einem 


# makefile für "Demo" 

# Version vom 24.05.94 

Demo: main.o # heute nur eine Objektdatei 
mpc main.o -o Demo # Linkeranweisung 

Da Kommentare dem Make selbst ziemlich egal sind, werden sie auch nicht irgendwie gemerkt. 
Aber immerhin merkt sich MaxonPASCAL Make beim Lesen einer Projektdatei, ob darin 
Kommentare, Makros oder Regeln (siehe dazu die nächsten Abschnitte) vorkamen. Haben Sie als 
Benutzer von MPASCAL in der integrierten Umgebung an der Projekdatei etwas verändert, so daß 
das Makefile neu geschrieben werden muß, dann fragt MPASCAl, sicherbeitshalber noch einmal 
nach, ob das offensichtlich von Hand erstellte Makefile wirklich überschrieben werden soll. Es 
erscheint also eine Dialogbox jnit dem Inhall 

Die Projektdatei „<name>“ wurde nicht von 
MaxonPASCAL Make automatisch erstellt. 

Wollen Sie sie trotzdem überschreiben? 

Ja Nein 

Sie haben dadurch bei Bedarf noch Zeit, z. B. eine Shell zu öffnen und Ihr mühsam handgeschriebe¬ 
nes Makefile vor der Vernichtung durch MP,\SCA1. zu retten. Sie können die obige Nachfrage natür¬ 
lich auch verneinen, aber dann wird das Update der Projektdatei nur aufgeschoben, nicht aufgeho- 
Ikm, und bei der nächsten Gelegenheit nervt MPASC.M. erneut mit der selben Frage. 

10.3.5.3 Makros 

Auch einfache Makros können in Make verw'entlet werden. Dieses Feature geht aber keineswegs so 
weit wie z. B. die Makros im PASCM.-Preprozessor, vielmehr kann man im Text lediglich eine 
Zeichenfolge (den Makronamen) durch eine andere ersetzen las.sen. .Maer auch das ist hin und wie¬ 
der ganz nützlich. 

Man definiert sich ein Makro durch eine Zeile der Form 
<.Makroname > = < Inhalt > 

Als Makroname ist dabei eine beliebige Folge von Buchstaben, Ziffern und dem Unterstrich 
erlaubt. 

Objects = main.o test.o sub.o 
llnk_2 = mpc -g40 -gsi -1 amiga 
X = Exeflle 



MaxonPASCAL 


232 


Naciidem ein Makro auf diese Weise definiert wurde, kann es benutzt werden, Dazu muß dort, wo 
tias Makro durch seinen zugewiesenen Wert ersetzt w'erden soll, ein Doiiarzeichen „1“ vorangestellt 
werden. Ist der Makroname mehr als ein Zeichen lang, muß er außerdem auch noch in runden 
Kiammein eingeschiossen werden. Nach den obigen Definitionen könnte eine .Make-Datei also so 
beginnen: 

$X: $(Objects) 

$(link_2) 

$(Objects) 

Daran sehen Sie auch schon die beiden typischen .Anwendungen von Makros im Makefiles: Zum 
einen spart man bei geeigneter .Anwendung Tiitparlteit, zum anderen mui,‘! man für bestimmte Ande- 
mngen wie das Hinzufügen weiterer Objektdateien nur noch an einer Stelle der Datei die 
Makrodefinition verändern, statt an mehreren Stellen den gleichen Mist einzutippen. Nebenbei räu¬ 
men geschickt gewählte Makros den Quellte.xt auf und sorgen so fiir mehr Übersicht. 

Es gibt einige vordefinierte Spezialmakros: 

Jl“ ist fest mit dem Dollarzeichen belegt. Wenn Sie an irgend einer Stelle Ihrer Prnjektdatei ein ein¬ 
zelnes „$ haben sollen, z. B. als Bestandteil eines eigentümlichen Dateinamens wie „a$b". müssen 
Sie also ein doppeltes Dollarzeichen schreiben („a$ib‘"), um Make davon abzuhalten, das nachfol¬ 
gende (hier also „b ) als .Makro zu Ixihandeln. Außerdem gibt es noch „$*“ und die bei 
Regeln eine wichtige Rolle spielen: 

10.3.5.4 Regeln 

Es ist auf die Dauer ziemlich ermüdend, immer wieder von Hand einzutippen, daß Make aus einer 
auf „.asm endenden lextdatei eine „.o"-Objektdatei erzeugen soll, indem es einem bestimmten 
Assembler mit bestimmten Optionen aufruft. Dieser Vorgang kann durch Make-Regeln erheblich 
abgekürzt werden. 

Die Definition einer Regel sielit auf den ersten Blick wie ein ganz normaler .Makefile-Eintrag aus, nur 
tlaß der Name der (Pseudo-)Zieldatei aus den Endungen von Quell- und Zieldatei zusammengesetzt 
ist und keine Abhängigkeiten angegeben werden dürfen. Eine typische Regel für .Assembler-Module 
könnte z. B. so aussehen: 

■asm.o: masm -c cloB $*.asm -o $@ 

Das Makro „$*“ wird durch den seiner Endung beraubten Dateinamen, „S(g'" durch den vollständi¬ 
gen Namen der Objektdatei ersetzt. 

MaxonPASCAL Make wendet Regeln nur an, um Objektdateien zu erzeugen, die in tler 
Abhängigkeilszeile der Linkeranweisung genannt werden und für die es keinen Eintrag mit einer 
expliziten Conipileranweisting gibt. Dann wird nach der ersten Regel gesucht, bei der die Endung 
der Zieldatei (meist „.o“) stimmt und eine entsprechende Quelldatei auch existiert. 



10, ProiekU'erwaltung ■ MAKE 


233 


Beispiel: 

.p.o: pc -c -pc -O $*.p 
Demo: main.o test.o 

pc main.o test.o sub.o -o Demo 
main.o: main.p test.h 

Wenn nun die Dateien „main.p“, „test.p“ und „sub.p“ existieren, wird für „test.o“ die erste, für 
„main.o“ die zweite und für „sub.o“ überhaupt keine Regel benutzt - denn wenn „sub.o“ nicht in der 
Abhängigkeitszeile der Exe-Datei auftaucht, sieht Make auch keinen Handlungsbedarf zur 
Erzeugung derselben. 

Für „main.o“ wurde im Beispiel sogar eine Mahängigkeitszeile eingeführt. Gibt es eine solche nicht, 
setzt Make automatisch den Namen der Quelldatei als einzige Abhängigkeit. 

Es gibt beim MaxonP.\SCAI,-Make zwei eingebaute Regeln: 

.p.o: pc -c $*.p übersetzt Pascal-Quelltexte. 

Beachten Sie, daß MaxonPASCAL Make bei interner Übersetzung als Compiler-Optionen die global 
eingestellten Defaults verwendet. Außerdem gibt es eine „.asm.o“-Anweisung für.\ssembler-Module. 
In der integrierten Umgebung MPASCAI. kann die zugehörige AnweLsungszeUe im System- 
Dialogfenster eingegeben werden (übrigens die selbe Anweisung, die auch benutzt wird, w'cnn der 
Menüpunkt „Text uad Objekt aufnehmen“ auf eine „.asm“-Datei angewendet wird). 




11. Standard-Units 


235 


11. Standard-Units _ 

Auf Ihren Ma-xonPASCAL-Disketten finden Sie einige fertige Units, die Sie in Ihren Programmen ver¬ 
wenden kiinnen. Diese Unit-Sammlung wird ständig ei-weitert (insbesondere sind Sie, jawohl, genau 
Sic (!), aiifgerufen, von Ihnen geschriebene nützliche Units der Allgemeinheit zur Verfügung zu stel¬ 
len). Deshalb können wir schlecht alle mitgelieferten Units in diesem Handbuch dokumentieren. 
.Also folgt jetzt eine Beschreibung der wichtigsten Standard-Units, zu den übrigen werden Sie 
Dokumentationen als ASClI-Datei auf der Source-Diskette finden. 

11.1 Crt und PASCALCrt 

Das Unit Crt öffnet in seinem Initialisierungsteil auf der Workbench ein Window geeigneter Größe 
sowie ein Console-Device dazu und verbiegt mit „SetSldlO“ die Standard-Ein-/Ausgabe auf dieses 
Fenster. Also erspart dieses Unit Ihnen viel Routinearbeit, wenn Sie für die Ein- und Ausgaben eines 
Programms ein eigenes Fenster öffnen wollen. 

Außerdem stellt Crt einige Prozeduren und Funktionen zur Verfügung, die Sie vielleicht schon 
vermißt haben; Mit „ReadKey“ und „KeyPressed" ist es endlich möglich, einen Tastendruck abzufra- 
gen (Iteim AMIGA ist dies nicht ohne weiteres über die Standard-EA, die ja ein „CON:“-Window ist 
oder wenigstens so tut als ob, möglich). Durch die Funktion „WindowClosed“ können Sie das 
Betätigen des Fenstei-schließsymbols abfragen. Auch andere Ereignisse können Sie bequem abfra- 
gen, und da Sie Rastport und Userport des Fensters kennen, können Sie im Ausgabefenster sogar 
(zusammen mit den Units „Intuition“ und „Graphics“) Grafik ausgeben oder Gadgets und Menüs 
venvenden. 

Auch wenn Sie alle diese Features nicht brauchen, können Sie das Unit „Crt“ benutzen, um Ihre 
Programme von der Workbench stanbar zu machen: „Uses Crt“ bewirkt, daß beim Programmstart 
automatisch ein Window geöffnet und die Standard-EA darauf umgeleitet wird - sonst laufen die 
Programme genau wie zuvor. 

TOhrend „Crt“ in Assembler programmiert wurde, um den Code möglichst kompakt zu halten, ist 
„PASC.ALCrt“ (im Untercorzeichnis „Windows“) eine sonst vollkommen identische Implementation 
des Units „Crt“ in P/\SC.M.. Dieses Imit liegt Ihnen auch als Quelltext vor, so daß Sie es bei Bedarf 
mixlifizieren können. 

Es ist aber nicht sinnvoll, in einem Programm sowohl „Crt“ als auch „P/\SCALCrt“ zu benutzen, denn 
dann werden ja gleich zwei identische Ausgabefenster geöffnet. 

Folgende Prozeduren und Funktionen werden jeweils in den teiden Units definiert; 

Functioü KeyPressed: Boolean 

Die Funktion KeyPressed wird „true", wenn eijre Taste gedrückt wird bzw. sich bereits im 
Tastaturpuffer befindet oder am l.iserPort des Ausgabefensters eine Nachricht eintrifft bzw, schon 
anliegt. 



MaxonPASCAL 


236 


Beispiel: 

Repeat 

Write('Hallo! ') 

Untll KeyPressed; 

Das Programmfragment gibt so lange ununterbrochen „Hallo“ aus, bis eine Taste gedrückt oder das 
Fensterrschließsymbol angeklickt wird. 


Procedure WaitForKey 

Die Prozedur wartet, bis eine Taste gedrückt wird oder ein Ereignis eintritt. Falls sich bereits eine 
faste im Puffer befindet oder eine Nachricht am Window-UserPort anliegt, wird natürlich nicht 
gewanet. 

sVaitForKey verbraucht beim Warten keine Rechenzeit, ist also solch’ fragwürdigen Konstrukten 
(„busy wait“) wie 

Repeat üntil KeyPreesed 
in jedem Fall vorzuziehen. 


Function ReadKey: Char 

Diese Funktion liest ein Zeichen von der Tastatur. Dabei wird zuvor durch Aufruf von „WaitForKey“ 
auf eine Taste oder ein Ereignis (Message) gewartet. Falls keine Taste gedrückt, statt dessen aber 
eine Message empfangen wurde, gibt ReadKey den Wen chr(O) zurück. 

Beispiel: 

Uses Crt; 

Var O! Char; 

Segln 
Repeat 
c:= ReadKey; 

WriteLnt'ABcii-Code', ord(c):4) 
üntil o = ehr(13) 

End. 

Das Programm holt Zeichen von der Tastatur und gibt deren ASCIl-Code aus, bis der Code der 
Return-laste gelesen wird. ReadKey bewirkt kein Echo, d. h. ein gelesenes Zeichen wird nicht auto¬ 
matisch auf den Bildschirm au.sgegeben. 

Function MessageReceived (Maske): Boolean 

Maske: Longint 

Wenn „KeyPressed“ wahr wird, bnn das zwei Ursachen haben: Entweder wurde eine Taste gedrückt 
oder am UserPon des Ausgabefensters wurde eine Nachricht empfangen. Diese Messages enthalten 



11. Standard-Units 


237 


Infurmationen über verschiedene Ereignisse, z 


, B. Betätigung des Fensterschließgadgets, Anwahl 


eines Piill-Down-Menüs usw, 

FaUs eine derartige Nachricht anliegt, liefert „/W%“ den Wert Chr(O), und man kann mit 
„MessageReceiveci“ bestimmen, um welche Art von Nachricht es sich handelte. 

Im Interfiiceteil des Units „Crt“ werden die folgenden Konstanten definien: 


NEWSlZE 

REFRESHWINDOW 

MOUSEBUTTONS 

MOUSEMOVE 

GADGETDOWN 

GADGETUP 

REQSET 

MENUPICK 

_CLOSEWINDOW 

RAWKEY 

REQVERIFY 

REQCLEAR 

MENUVERIFY 

NEWPREFS 

DISKINSERTED 

DISKREMOVED 

WBENCHMESSAGE 

ACTIVEWINDOW 

NACTIVEWINDOW 

DELTAMOVE 

VANILLAKEY 

INTUITICKS 


$00000002; { Änderung der Fenstergröße} 
$00000004; { Fensterinhalt neu aufzubauen } 
$00000008; { Drücken/Loslassen einer Maustaste } 
$00000010; { Mausbewegung } 

$00000020; {Gadget angeklickt} 

$00000040; { Gadget losgelassen } 

$00000080; 

$00000100; { Menü angewählt} 

$00000200; {Close-Gadget) 

$00000400; {Tastendruck, Key-Code} 
$00000800; 

$00001000; 

$00002000; 

$00004000; {Ändern der Preterences) 
$00008000; { Einlegen einer Diekette} 

$00010000; { Herausnehmen einer Diskette} 
$ 00020000 ; 

$00040000; { Fenster aktiviert} I 
$00080000; { Fenster deaktiviert} 

$00100000; {Verschiebung bei Gadgets } 
$00200000; {Tastendruck, ASClI-Code} 
$00400000; 


Diese Zahlen heißen „IDCMP-Flags“ („IDCMP" = „Intuition Direct Communicaüon Me.ssage Port“). 


Man kann mit 


If MessageReceived (NEWSIZE) Tlien ... 

abfragen, ob die Fenstergröße verändert wurde. Da aber jedes Signal einem Bit entspricht, kann 
man auch abfragen, ob eins von mehreren Signalen empfangen w-urde, indem man die Codes mit 
OR verknüpft: 

Repeat 

Until MeasageReceivedtDISKREMOVED Or _CLOSEWINDOW); 

Diese Schleife wird ausgeführt, bis eine Diskette aus dem Laufwerk entnommen oder das Fenster 
geschlossen wurde. 



MaxonPASCAL 


238 


Vorher muß man aber dem Betriebssystem mitteilen, von welchen Ereignissen man überhaupt 
erfahren möchte, und zwar mit den Prozeduren „SellDCMP" und „MdlüCMP“. Als Default ist beim 
Offnen des Fensters nur das „JlLOSmiNDOW-Vh^ gesetzt. „MemgeReceived' holt die Nachricht 
aber nicht ab - Sie müssen mit der „/?e*-“-Funktion das Chr(0)-Zeichen lesen, damit das Unit 
„Crt weiß, daß Sie die Message ausgeweriei haben. 

Eine Auswertung der Fenster- und/oder Tastaturereignisse konnte also so aussehem 

Uses Crt; 

Var c: Char; 

Begln 

AddlDCMP (MODSEBUTTONS); { zusätzlich Mauskllcka abfragen } 

Repeat 

c:= ReadKey; 

If c = chr(O) Then 
Begln 

{ Nachricht auswerten: } 

If MessageReceived(MOaSEBUTTONS) Then 
WritelnC Klick!’); 

If MessageReceived(_CLOSEWINDOW) Then 
Writelnt' Bye bye!'); 

{ usw. } 

End 

Else 

Begin 

{ Taste auswerten, z. B. so: } 

Write(c); 

End; 

{ Programmende mit Close-Gadget oder Esc-Taste: } 

Until {MesaageReceived(_CLOSEWINDOW) ) Or (c=#x); 

End. 

Natürlich sind beide leile o[itiünal, d. h. wenn Sie nur Tasten oder nur Messages auswerten wollen, 
können Sie tiie jeweils anderen Ereignisse ignorieren. Wichtig ist nur, daß Sie auch zur Message- 
Behandlung die Funktion „ReadKty“ benutzen müssen, denn sonst kann das Unt „Crt“ ja nicht wis¬ 
sen, wann Sie eine Nachricht au.sgewertet haben und die nächste haben wollen. 


Procedure SetlDCMP (Maske) 

Maske: Longlnt 

Diese Prozedur definiert die IDCMP-Flags des Aiisgaliewindows (siehe unter JlessageKeceived"). 
Als Default ist am .Anfang nur „_aOW/;VDOW'‘ gesetzt. 


Procedure AddlDCMP (Maske) 

Maske: fxmglnt 



11. Standard-Units 


239 


Im Gegensatz zu „SeUDCMP", das die IDCMP-Flags definiert, ftigt die Prozedur „AddlDCMP“ nur 
neue Flags hinzu. Der Parameter wird also mit den bisherigen Flags OR-verknüpft. Somit ist 
,AddlDCMP(0)'‘ eine leere (nichts bewirkende) Anw'eisung, während „SetlDCMP(O)“ alle Flags 
löschen würde. 


Procedure SublDCMP (Maske) 

Maske: Longint 

Dies ist das Gegenstück zu „AiMIDCMP“-. Die als Parameter übei^ebenen Flags werden aus der 
IDCMP-Maske des Fensters gelöscht. 


Function WindowClosed: Boolean 

Diese Funktion ist eine Ahkürz.ung für „.Me.ssageReceived(_CLOSRV('lNDO'K')“. 

Man kann damit bequem abfragen, ob das Close-Gadget des Fensters angeklickt wmrde. Es gilt aber 
dasselbe wie bei „MessageReceived“: Die Ereignisse müssen mit der „ReadKey"-?unküon abgeholl 
werden, damit das „Crt‘‘-Unil weiß, daß sie bearbeitet wurden. 

Beispiel: 

Uses Crt; 

Var c: Char; 

Begin 

Repeat 

c:= ReadKey 
üntll WindowClosed 
End. 

Ohne den „ReadKey“-Aufruf wäre dies eine Endlosschleife, denn die entsprechende Message würde 
nie am Userport des Windows abgeholt; außerdem wäre es ein „Busy Wait", der Rechenzeit ver¬ 
schwendet. 

Function CrtMessage: Ptr 

Falls ein Aufruf von „MesscigeRecewed“ ergibt, daß eine Nachricht empfangen wurde, liefert diese 
Funktion einen Zeiger auf dieselbe (sonst „NIL"). Man kann sie dann näher auswenen. 


Uses Crt, Intuition; 

Var c: Char; 

m; ‘IntuiMessage; { im Unit "ntuition" definiert ) 
Begin 

AddlDCMPtMOUSEBUTTONS); 

Repeat 

c:= ReadKey; 

If MessageReoeived(MOUSEBUTTONS) Then 



MaxonPASCAl. 


240 


Begln 

m;= CrtMesaage; 

Writelnl'Position:', m*.MouseX:5, m*.MouseY:5); 

End 

Untll WlndowClosed 
End, 

'Xenn Sie mit der linken Maustaste in das Ausgabefenster klicken, gibt dieses Programm die genau¬ 
en Koordinaten der Position an. 


Function CrtMndow: Ptr 

Diese Funktion liefert die Windowhandle des Crt-Windows. Sie brauchen Sie für viele Zwecke, z. B. 
wenn Sie das Fenster mit einem Gadget oder Menü versehen wollen. 


Function CrtRastPort: Ptr 

Mit dieser Funktion erhalten Sie einen Zeiger auf den RastPort des Crt-Fensters. Diesen Pointer 
benötigt man vor allem für Grafikbefehle. 

Beispiel: 

Uses Crt, Graphics; 

Var Elng6ibe: Char; 

1: Integer; 

xl, x2, yl, y2: Real; 

Begln 

Wrlte(#e'0 p'); 

{ Cursor unsichtbar machen } 

SetAPentCrtRastPort, 1); 

{ Zeichenfarbe: weiß } 

Por 1:=1 to 200 Do 
Begln 

xl:= 320+300*sln(l/25); 
x2:= 320-300*sln(l/20); 
yl:= 120+100»cos(l/32); 
y2:» 120+100*cos(1/40); 

Move(CrtRastPort, Round(xl), Round(yl)); 

Draw(CrtRastPort, Round(x2), Round(y2)) 

End; 

Repeat Eingabe:» ReadKey Untll WlndowClosed 
End. 

Die,ses Programm gibt mit Hilfe dreier Funktionen der Graphics-Library (die in Unit „Graphics“ defi¬ 
niert wird) ein recht hübsches .Muster aus. 

Im entsprechenden Abschnitt der AMIGA-Einführung in diesem Buch finden Sie Näheres über die 
Grafikfunktionen. 



11. Standard-Units 


241 


Function CrtUserPort: Ptr 

Gibt einen Zeiger auf den l'serPort des Cn-Fensters. 


Function NameOfPrograin: Str 

Diese Funktion gibt tien Namen des Cn-Fensters aus. Im allgemeinen wird hier der Name genom¬ 
men, unter dem das Programm als FAC-File von der Workbeneh oder vom CU geladen wurde. Falls 
es aber aus der MaxonPASCAL-Entwicklungsumgebung gestartet wurde, gibt es zwei Sonderfälle: 
wurde Ma.xonPASCAL aus dem CLI gestaltet, erhält das Console-Fenster die entspreehende CLl- 
Anweisung, beim Workbenchstart wird „MaxonPASCiAL“ als Default benutzt. 


Function CrtConsole: Ptr 

Von dieser Funktion erhalten Sie die Handle des Console-Devices, das vom Unit „Crt" für das Ein- 
/Ausgabefenster geöffnet wird. Wenn Sie in Ihrem Programm ein zweites Window öffnen und mit 
JetSicllO“ die Standard-E/\ vorübergehend darauf umleiten, können Sie sie nachher wieder mit 
„SetStdlO(CrtConsole)“ auf das normale Cit-Fenster zurücksetzen. 


Function TextLines; integer 

Diese Funktion gibt an, wieviele Textzeilen im Ausgabefenster Platz haben. 


Function TextColms: integer 

Gegenstück zu „TextLines“: Gibt die Anazhl der Textspalten des Windows zurück. 


USES crt; 

BEGIN 

Writelnt'Das Fenster ist '»TextColms,»TextLines,' Zeichen 
groß.'); 

WaitForKey 

End. 


Function WhereX: integer 

Mit dieser Funktion können Sie die aktuelle Cursorposition erfragen. Sie gibt die Spalte zurück, in 
der der Cursor steht. 


Function WhereY: integer 

Liefert analog zu „WhereX" die Spalte, in der der Cursor gerade steht. 



MaxonPASCAL 


242 


Procedure 'MiidowUtles (windowname, screenname: Str) 

Das Unit „Crt“ gibt dem Window den Namen, unter dem das Programm gestartet wurde. Mit der 
Prozedur „WindowTitles“ kann dieser Name sowie der Name der Workbench geändert werden. Der 
Titel der Workbendi ändert sich aber nur solange, wie das Cit-Fenster aktiv ist. 

Wenn Sie einen Parameter auf „Nil“ setzen, entspricht dies keinem Namen. Der Wert „Str(-1)“ 
bewirkt, daß der bisherige Name erhalten bleibt. 

Beispiele: 

WindowTitles ('Test', Str(-l)) 

Window heißt „Test“, Name des Workbenchscreens bleibt erhalten 

WindowTitles (Dateiname, 'Editor'); 

Der Fenstername entspricht dem Inhalt der Variablen „Dateiname“ (z. B, eine Stringc-ariable), 
während der Worklienchscreen bei aktivem Cn-Fenster den Namen „Editor“ erhält. Achtung: Wenn 
Sie den Inhalt der Stringvariablen ändern, wird der Fenstername NICHT automatisch aktualisiert 
(woher soll das Betriebssy'stem das auch wissen), sondern erst beim nächsten Refresh der Titelzeile. 
Sie sollten also bei jeder Zuweisung an die Variable erneut die „Wmdou’Titles“-?roiedur aufrufcn. 

WindowTitles {Str(-l), Nil); 

Der Fenstername bleibt erhalten, die Workbench wird namenlos, 

11.2 Printer 

Dieses Unit ist in PASCAL geschrieben und ausgesprochen kurz: Im Interfaceteil wird lediglich eine 
Text-Dateivariable namens „Lst“ definiert und im Init-Teil unter dem Namen „PRT:“ zum Schreiben 
geöffnet. Falls dies nicht gelinge, bricht das Programm mit einer entsprechenden Fehlemieldung ab. 

Durch Einbinden dieses Units können Sie also einfach mit 

Write {Lst, ...) 

Daten auf den Drucker ausgeben. 

11.3 Die AMIGA-System-Units 

Zum professionellen Programmieren sind auf dem AMIGA die System- Includedateien unverzächt- 
bar. Sie enthalten zahllose Deklarationen von Konstanten, Datentypen und Library-Funktionen und 
ermögiiehen so den vollen Zugriff auf das AMIGA-Betriebssystem. 

Das Problem bei diesen Includefiles ist, dal:! es ganz schön viele werden können und das Übersetzen 
somit spürbar Zeit kostet. Um dies etwas zu be.schleunigen, wurden zu den wichtigsten Includefiles 
Units erstellt. Ihr Interfaceteil besteht im wesentlichen aus den Includefiles, während ihr 



11. Standard-Units 


243 


Implementationsteü meist leer ist (Irei einigen werden im Init-Teil kleine Initialisierungen vorge- 
nommen). 

Wegen des enormen Umfangs dieser Indudefiles kann an dieser Stelle nicht jeder dort definierte 
Be/eichner erwähnt (und schon gar nicht erläutert) werden. Einiges wird in diesem Handbuch 
noch im Kapitel über Systemprogrammierung erklärt, sonst kann ich Ihnen nur empfehlen, sich die 
entsprechenden Indudefiles einmal arottisehen und auf die diverse Literatur zur AiMIGA- 
Systemprognammierungverw'eisen. 


11.3.1 Execl und Exec 

E.xec ist der innerste Teil des A.M1GA-Betriebssystems. Deshalb werden einige der Exex-Indudes 
auch von anderen Betriebssystemteilen benutzt, während man andere nur braucht, w'cnn man wirk¬ 
lich direkt Exex programmieren will. 

Aus diesem Grund wurden zwei Exec-Units definiert: Zunächst „Execl“, das in seinem Interfaceteil 
folgende Indudefiles enthält; 

exec/lists.h 
exec/nodes.h 
exec/porta.h 
exec/semaphores.h 
exec/taaks.h 

Das Unit Excel wird dann auch von so ziemlich allen anderen Systemunits benutzt, 
ln ..Exec“ wird dann der gtmze Rest definiert, namentlich der Inhalt folgender Include-Dateien: 

exec/alerta.h 

exec/devices.h 

exec/exeebaae.h 

exec/errora.h 

exec/inte rrupt s.h 

exec/io.h 

exec/librariea.h 

exec/memory.h 

exec/reaident.h 

AuKerdem wird hier mit „USES“ das Unit „Execl“ eingebunden, so daK dann auch die Definitionen 
dieses Units automatisch zur Verfügung stehen. 


11.3.2 GraphTypes und Graphics 

Die „Graphics“-lndudes sind im wesentlichen in zwei Dateien enthalten: „GraphTypes“ und 
„Graphics“. Erstere enthält die wichtigsten Datentypen im Grafik-Bereich, nämlich den Inhalt lol- 
gender Dateien: 

graphics/gfx.unit.h 
graphlcs/clip.h 



MaxonPASCAL 


244 


graphics/copper.h 
graphlcs/view.h 
graphica/layers.h 
graphics/rastport.h 
graphic s/text.h 

Die Datei „gfe.unit.h“ ist identisch mit „gßc.h“, enthält aber von der dort deklarierten Funktion 
„RasSize“ nur den Kopf (wie es im Interfaceteil von Units sein muß). Der Rumpf dieser Funktion 
steht im Implementationsteil des Units. Außerdem benutzt dieses Unit das oben beschriebene Unit 
„Execl". 

Das Unit „Graphics" tenutzt „Execl“ und „Graphtypes“. Im Interfaceteil steht nur noch die 
Includedatei „graphics.unit.lib“, die sich von „graphics.lib“ darin unterscheidet, daß die Prozedur 
„OjrcnGfe" fehlt. Statt dessen wird die Graphics-Library im Initialisierungsteil des Units geöffnet. 
Wenn Sie das Unit „Graphics“ benutzen, mü.ssen Sie diese Bibliothek also weder selbst öffnen noch 
schließen. 

Beachten Sie aber, daß diese beiden Units nicht alle Grafik-Includes repräsentieren. Wenn Sie also z. 
B. mit Gels arbeiten w'ollen, müssen Sie die Datei „graphics/gels.h“ zusätzlich als Includedatei aufru- 
fen. 


11.3.3 Intuition 

Im Interfaceteil des Units „Intuition“ stehen folgende Includedateiem 

intuition/intuition.h 
intuition/screens.h 
Intuition.lib 

Außerdem werden die Units „Execl" und „Graphtypes“ benutzt. Der Inhalt der Dateien 
„intuition/intuitionbase.h“ und „intuition/preferences.h“ ist also nicht Bestandteil des Intuition- 
Units. Im Initialisierungsteil des Units wird die Intuition-Library geöffnet. 


11.3.4 Custom 

Das Unit „Custom" entspricht der Includedatei „hardware/custom.h“ und definiert somit die 
Struktur der Custom-Chip-RegLster. Außerdem exportiert das Unit eine Variable: 

VAR CC: Custom ABSOLUTE $DPF000; 

Somit ist es möglich, über diese Variable die Chipregister direkt anzusprechen. 

Ein extrem einfallsreiches (aber wenigstens kurzes) Beispiel: 

Usea Custom; 

Var i: integer; 

Begln 

For l:sO to MaxInt Do 
oc.colortO]!= i 



11. Standard-Units 


245 


End. 

Dieses kleine Programm änden für einige Zeit ständig die Hintergrundfarbe. 


11.4 ExecSupport und ExeclO 

Zwischen der direkten Programmierung der I lardware und dem Zugriff darauf über Libraries gibt es 
im AMIGA eine weitere Ebene, Geräte wie z. B. den Drucker oder die Diskettenlaufwerke zu pro¬ 
grammieren; Die Devices. 

Dabei liandelt es sich hauptsächlich um Tasks, die ständig laufen (aber natürlich im Waiting State 
sind, wenn sie gerade nichts zu tun haben, und somit keine Rechenzeit verbrauchen). Andere Tasks 
können den Devices durch Messages Aufträge erteilen, die dann - falls möglich - vom jeweiligen 
Device ausgeführt werden. 

Ein Device wird von MaxonPASCAL direkt unterstützt: Das Console-Device, das sich um 
Texteingaben und -au.sgaben in Windows kümmert. Aul.'lerdem enthält das AMIGA-Betriebssystem 
standardmäßig folgende Devices: 

Audio Device: erledigt Soundausgaben. .Man kann zwar auch über direkten Zugriff auf die 
Hardware-Register Töne erzeugen, aber über dieses Device geht das „sauberer“ und zum Teil 
auch einfacher. 

ffär Timer Device: bnn praktisch nur eine frei wählbare Zeit lang w'arten und dann melden, daß 
die Zeit abgelaufen ist. Man kann es brauchen, wenn man in bestimmten Zeitabständen irgend¬ 
welche Aktionen ausführen will. 

Trackdisk Device: Damit können Sie direkt auf die Blöcke und Sektoren von Disketten zugrei¬ 
fen. Wenn Sie eine Festplatte besitzen, verRigt Ihr Betriebssystem außerdem über ein Device, 
das analog zu „Trackdisk“ auf die Harddisk zugreift. 

Input Device: handhabt auf unterster Ebene Benutzereingaben aller Art. 

ES- Kevtoard Device: Tastaturtreiber - Gameport Device: befaßt sich mit den beiden „Gameports“, 
also den Maus- und Joystickschnittstellen. 

“ä“ Narrator Detice: ist für die (meist grausam klingende und deshalb nur selten benutzte) 
Sprachausgabe des AMIGA verantwortlich. 

Serial Device: Treiber für die serielle Schnittstelle. Jeder, der schon einmal die entsprechende 
Schnittstelle unter MS-DOS programmieren mußte, wird von der Leistungsfähigkeit dieses 
Devices erfreut sein. 

>'*■ Parallel Device: Treiber für die parallele Schnittstelle. 

Printer Device: befaßt sich mit dem Drucker und kann z. B. auch Grafiken ausdrucken. 
i®" Clipboard Device: unterstützt das Zwischenspeichern und spätere Wiederverwenden von 
Daten. 

Warum ich Ihnen das alles erzähle? Nun, im AiVlfGA-Betriebssystem „fehlen“ einige Routinen, die 
(hauptsächlich) die Programmierung von Devices komfortabler machen, nämlich die Exec-Support- 
Funktionen. Sie sind im .AMIGA ROM Kernel Reference Manual: Exec“ als Quelltext enthalten - aber, 



MaxonPASCAI. 


246 


wie nicht anders zu erwarten, in „C“. Diese Funktionen - außer „CreateTask" ■ stehen Ihnen als 
M;tx(inPASCAL-User aber in Form eines Units zur Verfiisun}’: Es heißt „ExecSupport“. 

Außerdem gibt es noch ein Unit namens „ExecIO“, das alles w'eitere enthält, was man so zum 
Device-Programmieren braucht. 

Aber zunächst zu „ExecSupport". Hier sind im einz.elnen folgende Prozeduren und Funktionen 
implementiert; 


PROCEDURE NewList (list: p_List); 

Initialisiert die Listenstruktur, auf die tier Parameter zeigt. 


FUNCTION CreatePort (name: Str; pri: Byte): p_MsgPort; 

Erzeugt einen Message-Port unter dem angegebenen Namen unti mit der Priorität „pri", und gibt 
einen Zeigerdarauf zurück. ,\ls kleine Besonderheit merkt das Unit ExecSupport sich, w'elclie Ports 
diese Funktion erzeugt hat, und entfernt tliese am Programmende automatisch (mittels eines ent¬ 
sprechenden ExitSer\'er,s), sofern dies noch nicht ge.schchen ist. 


PROCEDURE DeletePort (port: p_MsgPoit); 

Ein mit „CreatePort“ erzeugter Messageport wirtl entfernt. Wie bereits olren angedcutet, muß diese 
Prozedur in Ihrem Programm [traktisch nie direkt benutzt werden, da am Programmende automa¬ 
tisch alle erzeugten Messageports gelöscht werden. 


FUNCTION CreateStdlO (ioReplyPoit: p_MsgPort): Ptr; 

Diese Funktion erzeugt eine Standard-IO-Ketiuest-Struktur und gibt einem Zeiger tlarauf zurück. Als 
Paratneter wirtl ein Zeiger auf einen Mes.sageport benötigt, der z. B. zuvor mit „CreatePort“ erzeugt 
wtxden sein kann. Wenn die Struktur nicht eingerichtet werden konnte, steigt die Funktiotr mit 
einer Fehlermeldung aus. Wie bei „CreatePort" wertlen auch hier alle eingerichteten lO-Strukturen 
am Programmende automatisch freigegeben, sofern dies noch nicht geschehen ist. 

PROCEDURE DeleteStdIO (ioStdReq: Ptr); 

Als Gegenstück zu „CreateStdlO" löscht diese Prozedur eine „normale“ 10-Request-Struktur. 
Allerdings werden diese Strukturen am Programmende auch automatisch gelöscht, so daß Sie 
„DeleteStdIO" nur selten direkt benutzen werden. 

FUNCTION CreateExtIO (ioReplyPort: p_MsgPort; size: Long): Ptr; 

Einige Devices benötigen eine um gewisse gerätespezifische Einträge erweiterte IO-Ret]uest- 
Struktur. .Mit der Funktion „CreateFlxtlO“ kann man solche Strukturen beliebiger Größe (Parameter 



11. Standard-Units 


247 


„size“ entspricht der Gesamtgröße im Bties) analog zu „CreatcStdIO" erzeugen lassen. Die zusätzli¬ 
chen Felder werden mit Nullen initialisiert. 

.\uch diese Funktion steigt bei Mißerfolg mit einer Fehlermeldung aus und merkt sich intern die 
eingerichteten Strukturen, so daß diese am Programmende automatisch gelöscht werden. 


PROCEDURE DeleteExtlO (ioExt: Ptr); 

Diese Prozedur löscht eine mit „Create&ctIO“ erzeugte Stniktur. 


PROCEDURE BeginlO (ioReq: Ptr); 

Der Aufruf dieser Prozedur entspricht einem Einsprung in eine interne Funktion, die jedes Device 
besitzt und allgemein eine lO-Operation startet. „BeginlO“ ähnelt stark der Exec-Funktion „SendlO“, 
allerdings ist „BeginlO“ direkter, d. h. ohne zusätzlichen Exec-''Überbau‘'. Im allgemeinen sollte man 
„SendlO“ benutzen, während „BeginlO“ nur in einigen speziellen Fällen sinnvoll benutzt werden 
kann. 

Das Unit „ExecSupport“ benutzt übrigens das Unit „Execl“. 

Wie bereits erwähnt, gibt es noch ein Unit namens „ExedO“. Es benutzt die Units „Facecl“ sowie 
„ExecSupport“ und enthält im Interfaceteil folgende zur Deviceprogrammierung notwendigen 
Includefiles: 

'exec/libraries.h■ 

■exec Zdevices.h' 

'exec/io.h' 

Außerdem exportiert es noch zwei Prozeduren: 

PROCEDURE Open_Device (DevNametStr; Unit:Long; lOReq; Ptr; 

Flags: Long) 

Diese Prozedur entspricht der Exec-Funktion „OpenDevice“, bis auf zwei Unterschiede: 

1. Konnte das Device nicht geöffnet werden, steigt „Open_Device“ mit einer Fehlermeldung aus. 
Deshalb konnte es auch als Prozedur implementiert werden, während „OpenDevice“ eine 
Function ist, die eval. eine Fehlernummer zurückgibi. 

2. Wieder einmal wird über die geöffneten Devices Buch geführt, so dalä sie am Programmende 
vollauttrmatisch geschlossen werden und das System immer schön aufgeräumt ist. 

PROCEDURE Close Device (ioRequest: Ptr) 

Unterscheidet sich von der Exec-Prozedur „CloseDevice“ nur insofern, als daß hier anhand der von 
„Open_Dcv'ice“ erzeugten Liste geprüft wird, ob das Device auch wirklich geöffnet wurde und daß 
diese Prozedur verzichtbar Lst, da am Programmende alle Devices automatisch geschlossen werden. 




Anhang 


249 


A) Compiler-Fehlermeldungen _ 

expected. 

expected. 

expected. 

")" expected. * 
expected. 
expected. 

"=" expected. 

"[" expected. 

"]" expected. 

" expected. 

"OF" expected. 

"BEGIN" expected. 

"END" expected. 

Der Compiler vermutet, dal.'! an der angcgeheiien Stelle da.s entsprechende Symbol .stehen mül^te. 
Dabei ist aber zu beachten, daß er den Fehler nur grob analysiert und im Grunde gentimmen abso¬ 
lut keine Ahnung hat, was Sie an dieser Stelle eigentlich vorhatten. Deshalb kann der eigentliche 
Fehler auch an einer ganz anderen Stelle liegen. 

Absolute variables must get declared single. 

Werden Variablen als „A]3SÜI.LrrE“ deklariert, müssen sie einzeln deklariert werden. Falsch wäre 
■L. B. 

VAR a,b: integer ABSOLUTE Adr; 

richtig dagegen 

■VAR a: integer ABSOLUTE Adr; 
b: integer ABSOLUTE Adr; 

Boolean Expression expected. 

Der Compiler erwartet hier einen Boole'schen Ausdruck, for e.xample als Bedingung bei lF..Then, 
W1iile..Dü oder Repeat..Until. 

Branch too far. 

Sprünge, die inhärent bei P.ASCAl.-Strukturen wie IF, REPFAT oder GASE auftreten, dürfen im Code 
nur über eine Strecke von maximal 32767 Bytes reichen, ln der Praxis dürfte dieser Fehler kaum auf¬ 
treten, denn das bedeutet, daß sit:h z. B. eine Schleifenstruktur über tausende von Programmzeilen 





MaxonPASCAL 


250 


erstreckt. Falls Sie so etwas tatsäcltlich einmal zustande bringen, sollten Sie den Umfang der 
Struktur durch Zerlegen in Prozeduren verringern ■ denn Unterprogrammaufrufe (und auch GOTO- 
Spriinge) sind von dieser Regelung ausgenommen. 

Can not jump into a structure. 

Man kann mit GOTO nicht von außen z. B. in eine FOR-Schleife hineinspringen. 

Can not open mathieeedoubbas.Iibrary! 

Vor dem ersten Com[)iler-Lauf wirtl die genannte Bibliothek geöffnet. Sie muß sich also im „Libs:“- 
Verzeichnis befinden. 

Can not write unit. 

Die Interface-Datei eines Units konnte nicht geschrieben werden. 

Can’t copy tbis file. 

Bei einem Indude-Dateien mit zwei angegebenen Pfaden konnte die Datei zwar über den zweiten 
Pfad gelesen, nicht aber an den ersten Pfad kopiert werden. 

Can’t create directories. 

Beim Kopieren von Includefiles und Units werden bei Bedarf Unterverzeichnisse automatisch 
erstellt. Das ging hier schief 

CASE needs an ordinal expression. 

•Mit CASE können nur geordnete Datentypen verglichen werden, also beispielsweise keine Real¬ 
oder String-Werte. 

Compiler stack overflow. 

Der Task-Stack war nicht groß genug Rir den Compiler (dürfte kaum Vorkommen). 

Constant expected. 

Tritt an verschiedenen Stellen auf, u. a. Im CONST-Definitionsteil und in der CASE-.Anweisung. Hier 
darf nur eine Konstante stehen. 

DO expected. 

Hinter WHILE, WITH oder FOR fehlt das zugehörige DO. Vielleicht haben Sie sieb aber auch in der 
Bedingung vertan, so daß der Compiler deren Ende an dieser Stelle vorzeitig vermutet. 

Double definition 

Ein Label wurde zweimal gesetzt. 

Double use of Identifier. 

Sie haben in einem Deklarationsteil (z.B. Variablentleklaration) einen Bezeichner definiert, der auf 
selber Ebene schon einmal deklariert ist. 




Anhang 


251 


Element type is too large, 

Sets dürfen mxximal 65536 Elemente enthalten, wobei die Grenzen auf Vielfache von 16 auf- hzw. 
abgerundet werden. 

Error in String 

Beim Einschließen von Stcuercodes in Stringkerastanten haben Sie irgendetwas falsch gemacht. 

Error while reading unit. 

Dateifehler beim Lesen des Interface-Teils eines Units 

Field identifier expected. 

Dies ist kein gültiger Feldbezeichner dieses Recordtyps. 

FUe expected. 

Hier hat eine Variable eines Dateityps zu stehen. 

File is not of required Type 

Die mit ..{$link ...}“ oder als Unit eingelatlenc Datei ist keine Objektdatei. 

FILE OF FILE is not allowed. 

Der Elementtyp eines File-Typs darf weder selbst ein File-Typ sein noch einen solchen enthalten. 

File not found 

Eine Indude-Datei konnte nicht gefunden werden, vielleicht, weil sie gar nicht existiert. 

Filename expected. 

Hinter der Compiler-Directives „ind“ und „path" müssen jeweils Dateinamen stehen, die mit einfa¬ 
chen ' oder doppelten „ Hochkomma einzuschliessen sind. 

Filename too long. 

Die maximale linge von Dateinamen für Indude-Dateien beträgt einschließlich Pfad 80 /.eichen. 

Files must be VAR parameters. 

Wenn sie eine Datei als Parameter an eine Prozedur otler Funktion übergeben w’ollen, muß dies in 
Form eines VAR-Parameters geschehen. 

First constant is higher than second one. 

Bei der DeFinition eines Ausschnittstyps (z.. B. eines Array-lndextyps) haben Sie den Bereich so 
gewählt, daß die obere Grenze kleiner als die untere ist. 

FOR needs an ordinal type. 

Die Schleifenvariable einer FOR-Schleife muß von einem geordneten Datentyp sein (insbesondere 
nicht REAl.). 



MaxonPASCAL 


252 


Functions can return simple, pointer or string types only. 

Der Datentyp, den eine Function zurückgibt, kann sein: 

• Ganzzahl, Boolean, Char oder ein Ausschnitt eines solchen Typs 

• Real 

• Pointertyp 

• String 

Garbage at end of program. 

Hinter dem Programmende steht noch etwas. 

Global procedure without parameters expected. 

Prozeduren, die als Parameter bei .AddExitServer“ angegeben werden, müssen global sein und dür¬ 
fen keine Parameterliste halten. 

Identifier expected. 

Der Compiler meint, daß hier ein Bezeichner stehen müßte. 

Identifier not defined in that translation unit 

Ein Bezeichner wurde fälsch qualifiziert, z. B. „System.Hallo“, so daß er im entsprechenden Unit 
nicht gefunden werden konnte. 

Illegal type for textfile input 

Daten dieses Typs können nicht mit Read/Readln aus einer Textdatei (zum Beispiel von der 
Tastatur) gelesen werden. 

Illegal assignment or Compiler failure Type conflict or Compiler failure 
Double panic - general protectioni 

Hier haben Sie den Compiler ertappt. Es ist intern etwas eingetreten, was eigentlich nicht sein darf. 
Zu Deutsch: Es handelt sich um einen Bug des Compilers oder um einen fälschlich nicht gemelde¬ 
ten Fehler Ihres Programms. Wahrscheinlich liegt cs daran, daß er sich in der Vielzahl der kombi¬ 
nierbaren umerscbiedlichen Datentypen verheddert hat. 

Illegal type for textfile output. 

Daten dieses Typs können nicht mit Write/VChiteln in eine Textdatei (z, B. auf den Bildschirm) 
geschrieben werden. 

IMPLEMENTATION expected. 

im Interfaceteil eines Units trat ein Fehler auf. 

Incompatible parameterlists. 

Die Parameterhste (oder auch, bei Funktionen, der Ergebnistyp) eines Prozedur/Funktion- 
Parameters paßt nicht. 


Anhang 


253 


Integer expression expected. 

An dieser Stelle muß ein ganzzahliger Ausdruck stehen, z. B. als Längenangabe von String[..j oder 
Feldbreiten;mgahe bei Write(-Ln). 

Label expected. 

Hinter dem „LABEL“-Symbol kann entweder ein gewöhnlicher Ikzeichner oder eine Ziffernfolge 
(ganze Zahl) stehen. 

oder: Was hier hinter GOTO steht, ist nicht als Label deklariert worden. 

Label on wrong level. 

Ein label darf nur auf der Ebene ge.setzi werden, auf der es deklariert wurde, insbesondere nicht in 
einem Unterprogramm dieser Ebene. 

Lib-base must be of Longint or Pointer type. 

Die Basisadresse einer Library muß ein Ausdruck eines der genannten Typen sein (vielleicht liegt es 
daran, daß Sie „IntBase“, „DosBase“ oder „SysBase“ deklariert und dann ein System-Include-Datei 
geladen haben). 

Magic number does not match. 

Ein Unit woirde zwar gefunden, aber der Compiler stellte fest, ilaß es gar kein Unit ist. 

Memory overflow 

\Währencl des Cnmpilierens ist der Arbeitsspeicher übergelaiifen. Verlassen Sie MttxonPascal und ver¬ 
suchen Sie es mit größerem Arbeitsspeicher noch einmal. 

Name too long (max. 80 chars) 

Dateinamen von Units u. ä. dürfen einschließlich Pfad höchstens 80 Zeichen lang w'erden. 

Nesting overflow 

Die Schachtelungstiefe wn Prozeduren untl Funktionen darf höchstens 16 betragen. 

No free memory for buffer. 

Aus Geschwindigkeitsgründen wird für Include-Dateien jeweils ein Pufferspeicher angelegt. Dieser 
Error sagt, daß dafür kein S[ieicher mehr reseiviei t werden konnte. 

No free memory for BSS-Huok. 

Für die als STATIC oder EXPORT tieklarierten Variablen ist kein Speicher mehr frei. 

No free memory for relocation table. 

Der Cominler muß gelegentlich für die Relokationstabelle (was das ist, braucht Sie nicht unbedingt 
zu interessieren, falls Sie es nicht wissen) zusätzlichen Speicher reserc'ieren. Wenn Sie diese 
Meldung erhalten, haben Sie ihr RAM so vollgeknallt, daß nicht mehr einmal ein paar KByte für die¬ 
se Tabelle frei waren. 





MaxonPASCAL 


254 


No free memory for unit. 

Es war kein Speicher zum Einlinken einer Datei frei. 

Numeric expression expected. 

Hier muß eiti numerischer Aii.sdriick stehen. 

Only global Procedures/Functions can get exported. 

Lokale Prozeduren und Funktionen dürfen nicht mit ..EXPORT' ausgeführt werden. 

Ordinal Type expected. 

Ordinal expression expected. 

Hier dürfen nur geordnete Datentypen stehen, also Boolean, Char, Ganzzahl- und 
Aufzählungstypcn. 

Offsets must be integer. 

Die Adressoffsets in einer Library müssen natürlich gaimuhlig sein. 

Out of ränge 

Zur Compile-Zeit wurde bereits fcstgestellt, daß irgeiulwo ein Bereichsüberlauf .staitfmdet, z. B. bei 
„chr(257)“. 

Overflow at nesting of Incl-files 

Indude-Dateien dürfen mttximal 25-fach ineinander verschachtelt werden. Auch die Interface-Teile 
von Units werden beim Lesen intern als Indude-Dateien behandelt (w'as sie aber nicht sind), so daß 
dieser Fehler auch hier auftreten kann. 

Overflow in floating-point-aritbmetic. 

Bereits zur Compile-Zeit trat bei Fließkummarechnungen ein Überlauf auf, z. B. durch eine zu große 
Konstante. 

Please set an unit directory. 

Wenn Sie Units mit „USES“ einbinden oder ein Unit compilieren (wobei es automatisch abgespei¬ 
chert wird), müssen Sie im Pull-Down-Menü „Suchpfade“ mindestens ein Directory dafür angeben. 
Am besten setzen Sie mit dem PascalPrefs-Programm einen entsprechenden Eintrag in die Config- 
Datei. 

Please use „Round“ or „Trunc“. 

Gleitpunktausdrücke können nicht über nttrmale Typkonvenienmgen wie z. B. „Long(x)“ oder 
IntegerfSqrt (a))“ in ganze Zahlen gewandelt werden. Dazu sind die genannten Funktiojien zu ver¬ 
wenden. 

’PROCEDURE’ or FUNCTION’ expected. 

Die.ser Fehler tritt nur innerhalb einer Ubraty-Deklaration auf 



Anhang 


255 


“Program“ expected. 

Am Anfang mul^ nicht unbedingt „Program" stehen. Dieser Fehler wird immer gemeldet, wenn das 
Programm nicht sinnvoll anfängt. 

Short Circuit of Units. 

Ein Units ruft sich selbst auf, evtl, auch indirekt über weitere Units, 

Simple type expected. 

(wird u, a. bei EXCHANGE gemeldet): hier sintl nur Variablen einfacher Datentypen erlaubt: 
Geordnet, Real oder Pointer. 

String exceeds line. 

Eine Zeichenkette darf das Zeilenende nicht überschreiten. Vielleicht haben Sie bei einem String das 
Hochkomma am Ende vergessen oder eins gesetzt, w'o Sie gar keines setzen wollten. 

String expression expected. 

Falscher Parameter bei „Insert", „Delete“ o, ä. 

String too long. 

Die maximale Länge von Stringkonstanien beträgt 400 Bytes. 

Syntax error in Compiler directive. 

ln einer Compiler-Directive haben Sie irgend etwas falsch gemacht. 

Temporary Strings can not get assigned to „STR“-pointers. 

Die String-Verknüpfung „-f“ .sowie die Funktionen „Concat“, „Copy" und „RealStr“ liefern einen 
temporären String zurück, der keinen dauerhaften (also nur „temporären“) Speicherplatz besitzt. 
Deshalb ktinn man diese Fimktionsergehnisse zwar an STRING-Variablen zuweisen, nicht aber an 
STR-Variablen. 

Dieser Fehler wird auch gemeldet, wenn ein temporärer String als Parameter des Typs „Str“ überge¬ 
ben wird, 

THEN expected. 

Hinter einem IF fehlt das zugehörige THEN. Vielleicht haben Sie sich aber auch in der Bedingung 
vertan, so daK der Compiler deren Ende an dieser Stelle vorzeitig vermutet. 

These types can not be converted. 

Eine derartige Typkonvertierung ist nicht möglich. 

This function identifier ctm not be a Statement. 

Am Anfang eines Befehls - oder dessen, was der ComitUer dafür hält - steht unerlaubterweise ein 
Funktionsnamc. 





MaxonPASCAI. 


256 


This Procedure/Function can not be used as parameter. 

Nicht jetle Standaidfunktion kann als Parameter übergeben werden. Beispiele: ehr, sin, cos oder 
srqt dürfen, ord, eof oder sqr dagegen nicht. Faustregel; Fdne Funktion, bei der Parameterliste und 
Rückgabetyp immer gleich sind, darf übergeben werden {„sqrt“ bildet immer von Real auf Real ab, 
..Sqr“ aber von jedem numerischen Typ auf denselben, besitzt also mehrere Signaturen). Für 
Prozeduren gilt natürlich sinngemäK das selbe. 

TO expected. 

Hinter einem FOR fehlt das zugehörige TO oder DOWTO. Vielleicht haben Sie sich aber auch im 
Ausdruck vertan, so daß der Compiler deren Ende an dieser Stelle vorzeitig vermutet. 

Type expected. 

Hier muß ein Typ stehen, egal, ob als Typbezeichner oder als Beschreibung. 

Type conflict. 

Zwei Datentypen passen nicht zueinander, z.B. die heiden Konstanten, die die Grenzen eines 
Ausschnittstyps festlegen. 

Type conflict of operands. 

Die Typen zweier Operanden pas.sen nicht zusammen. 

T^'pe-free pointers must not be used here. 

Bei NEW und DISPOSE dürfen Sie keine Variablen des Typs „Ptr“ als Parameter angeben, da der 
Compiler ja nicht weiß, wie viel Speicher er dafür reservieren muß. 

Type identifier expected. 

Hier darf nur ein Typbezeichner stehen. Typbeschreibtmgen sind nicht zulässig. 

Unable to open main file. 

Nach dem (ibersetzen eines Units konnte die angegebene Hauptdatei nicht gefunden werden. 

Undefined Type. 

Dieser Datentyp wurde zwar schon erwähnt, aber noch nicht ilefinieri. 

Beispiel: „Type a= b; c=b;“ ergibt diesen Fehler. 

Unexpected end of source. 

Der Qtielltext war „überraschend“ (für den Compiler) zu Ende. 

Mögliche Ursache; Sie haben einen Kommentar begonnen und die Klammer am Ende vergessen. 

Unit not found. 

Das angegebene Unit w'urdc nicht gefunden. 




Unknown identifier or Syntax error. 

Diese Fehlermeldung kann so gut wie alles bedeuten und kann auch an so ziemlich jeder 
Programmstelle auftreten. Entweder wairde ein Bezeichner nicht deklariert oder ein grober Fehler 
in der Syntax gefunden. 

USES expected. 

Hinter „FRÜM <Projektname>'' muß „USES" stehen. 

Variable at odd address 

Einer als .tüiSOLUTE deklariene Variable, die mehr als ein Bete belegt, w'urde eine ungerade Adresse 
zugewiesen. Hier spielt der Prozessor nicht mit. 

Variable expected. 

Hier soll eine Variable stehen. 

WITH expects a variable of a record type. 

Hinter VC'TFH muß eine Record-Variable stehen (mit 99%-iger Wahrscheinlichkeit haben Sie an Stelle 
einer Record-Variablen einen Pointer auf eine solche gesetzt). 

Wrong Index type. 

Sie haben wahrscheinlich beim .\iTay-Zugriff einen Index mit einem falschen Datentyp verw'endet. 

B) Laufzeitfehler 
Subscript out of ränge. 

Der Index eines Arrays (wozu natürlich auch die Strings gehören) war außerhalb des angegebenen 
Bereiebs. 

Diese Fehlermeldung erhalten Sie nur, wenn im Menü „Optionen/Compiler“ der Punkt 
„Indexberekh“ abgehakt ist. 

Out of ränge. 

Einem Ausschnittstyp wurde ein Wert außerhalb des deklarierten Bereichs zugewiesen. 

Eine solche Bereichsüberprüfung wird nur vorgenommen, wenn die Compiler-Option „Subrange 
testen“ während des Compilierens angewählt ist. 

Division by zero. 

Es wurde mit „/‘, „div“ oder „mod" durch 0 dividiert. 

Error: Can’t open xxx.library 

a) Beim Befehl OpenLib wurde die angegebene Bibliothek nicht gefunden. 

b) Die „matbtrans.library'“, die für verschiedene Real-Funktionen benötigt ward, befindet sieb nicht 
im Verzeichnis „libs:“. 




MaxonPASCAL 


258 


Out of memory. 

Das freie RAM ist knapp, so daß „New“ oder„yl//oc_?nm“ nicht ausgeführt werden konnte. 

Freemem failed. 

a) Mit DISPOSE wurde versucht, ein dynamisches Objekt zu löschen, das nicht existiert bzw. 
bereits gelöscht wurde. 

b) Es wurde versucht, mit Free_Mem Speicher freizugeben, der nicht mit dem Befehl Alloc_mem 
reserviert wurde (wenn Speicher mit der Exec-Funktion ,AllocMem“ angefordert wxirde, kann er 
nur mit „FreeMem“, NICHT mit dem Befehl „Free_Mem" freigegeben werden). 

User Break. 

Sie haben das Programm mit der Taste <F10> abgebrochen. 

Error in Gase. 

In einem CASE-Statement ohne ELSE-Zweig trat eine nicht vorgesehene Alternative auf (also ein 
Wert, der nicht als Konstante angegeben ist). 

Error in Closelib 

Die angegebene Library existiert nicht, wurde bereits geschlossen oder war nicht mit OpenLib (son¬ 
dern z. B. mit der Exec-Funktion „OpenUbrary“) geöffnet worden. 

Overflow error. 

Es trat in einer arithmetischen Operation (z. B. Integer-Addition) ein Überlauf auf. 

Um eine solche Fehlermeldung zu erhalten, müssen Sie vor dem Compilieren die Compiler-Option 
„Aritbm. t/ftert“ aktivieren. 

Intuition error 

Ein Window oder Screen konnte nicht geöffiiet oder geschlossen werden. 

Exec error 

Bei einer Exec-Funktion lief etwas schief 


D) Die Kommandos des Editors 

ln diesem Teil des Anhangs erhalten Sie eine diematische Übersicht über alle verfügbaren 
Kommandos des Editors. Der Hinweis „Referenz" /.u Beginn eines Abschnitts gibt Ihnen das jeweili¬ 
ge Kapitel an, in welchem Sie weitere Informationen zu dem vorgestellten Kommando erhalten kön¬ 
nen. 

Alle Editorkommandüs werden in einem einheitlichen Format dargestellt. Bei der Angabe der 
Parameter gilt es folgendes zu beachten : 

Die Parameter werden von p", p' bis p" durchnumeriert. Hinter jedem Parameter wird sein Typ ange¬ 
geben. 

Beispiel: 

p''=STRlNG 

bedeutet, dai,^ der erste Parameter ein String sein soll. 

Fa; gibt folgende Parametertypen : 

1) VALUE: 

Eine ganze Zahl. 

2) STRING: 

Eine durch Anführungszeichen „ begrenzte Zeichenfolge. 

3) LIST: 

Eine durch „(" und „)“ begrenzte .Aufzahlung von Elementen. Die Elemente dürfen dabei 
VALIJES, STRINGS und natürlich auch USTcn sein. Im allgemeinen erw'arten die Kommandos 
Edw'ards jedoch ihre Parameter in einer genau spezifizierten Reihenfolge. Informationen darü¬ 
ber sind dann aber in der Beschreibung des Befehls zu finden. Listen dienen ebenfalls der 
Rückgabe von Werten, insbesondere im Zusammenhang mit der ARexx-Schnittstelle. 

Ein „OPT_“ vor einem Parameter bedeutet, daß er optional ist und auch weggelissen werden darf. 

Als Rückgabewert ist außer VALUE, STRING und LIST zusätzlich noch der sogenannte 
SMA11_STRING möglich. Hierbei handelt es sich um eine Zeichenfolge, die nicht durch 
Anführungsstriche begrenzt wird. Dies ist allerings nur im Zusammenhang mit der ARexx- 
Schnittstelle sinnvoll, da die Kommandos Edwards ihre String-Parameter immer als STRING erwar¬ 
ten. 



MaxonPASCAL 


260 


D-1 Eingabe und Bearbeitung von Texten 


Kommando : BackSpace 
Abkürzung Back 
Parameter 
Funktion 

Löscht das Zeichen links vom Cursor. Steht der Cursor am Anfang einer Zeile, so wird diese mit 
der vorigen Zeile zusammengefüg. 


Kommando : Delete 
Abkürzung Del 
Parameter 
Funktion 

Löscht das Zeichen, auf dem sich der Cursor befindet. Steht der Cursor am Ende einer Zeile, so 
wird diese mit der folgenden Zeile zusammengefügt. 


Kommando : KiüLine 
Abkürzung Kill 
Parameter 
Funktion 

Entfernt die aktuelle Zeile aus dem Text. Sie wird im Undo-Buffer gespeichert. 


Kommando : UndoLine 
Abkürzung Undo 
Parameter 
Funktion 

Befindet sich der Cursor in der zuletzt geänderten Zeile, so wird diese in ihren alten Zustand 
vor der Änderung versetzt. 

Befindet sich der Cursor in einer anderen Zeile, so wird die zuletzt geänderte Zeile in ihrem 
Zustand vor der Änderung vor der aktuellen Zeile eingefiigt. Dieses Verhalten dient vor allen 
dazu, eine durch „KillLine" gelöschte Zeile wieder richtig in den Text einzufügen. 






Anhang 


261 


Kommando : IndentRetum 
Abkürzung IRet 
Parameter 
Funktion 

Die aktuelle Zeile wird an der Cursorposition in zwei Zeilen aufgespalten. Der Teil der aktuellen 
Zeile, rechts vom Cursor, wird zur neuen aktuellen Zeile und mit Leerzeichen bzw. Tabs genau 
wie die davorliegende Zeile (die alte aktuelle) eingerückt. 


w 


Kommando 

.Abkürzung 

Parameter 

Funktion 


Return 

Ret 


Die aktuelle Zeile wird an der Cursorposition in zwei Zeilen aulgespalten. Der Teil der aktuellen 
Zeile, rechts vom Cursor, wird zur neuen aktuellen Zeile. 


Kommando : BigStepUp 
Abkürzung BSUp 
Parameter 
Funktion 

Bewegt den Cursor um etwas weniger als die ^Anzahl der angezeigten Zeilen nach oben. 


w 


Kommando : BigStepDown 
Abkürzung BSDown 
Parameter : 

Funktion : 

Bewegt den Cursor um etwas weniger als die Anzahl der angezeigten Zeilen nach unten. 


Kommando : MoveUp 
Abkürzung Up 

Parameter p'’=VALUE 

MoFunktion : 


Bewegt den Cursor um p" Zeilen nach oben. 







MaxonPASCAL 


262 


Kommando MoveDown 

Abküraung Down 

Parameter p"=VALUE 

Funktion 

Bewegt den Cursor um p“ Zeilen nach unten. 

Kommando : ScreenUp 

Abkürzung Slip 

Parameter p“=VALUE 

Funktion : 

Verschiebt den Textausschnitt unter dem Cursor um p“ Zeilen nach unten. 

Kommando : ScreenDown 

Abkürzung SDown 

Parameter p''=VALlIE 

Funktion 

Verschiebt den Textausschnitt unter dem Cursor um p" Zeilen nach oben. 


Kommando : MoveLeft 

Abkürzung Left 

Parameter p“=VALUE 

Funktion : 

Bewegt den Cursor um p" Zeichen nach links. Geht der Cursor über den Anfang einer Zeile hin¬ 
aus, so wird er an das Ende der davorliegenden Zeile gesetzt. 

Kommando : MoveRight 

Abkürzung Right 

Parameter p“=VALUE 

Funktion 

Bewegt den Cursor um p“ Zeichen nach rechts. Geht der Cursor über das Ende einer Zeile hin¬ 
aus, so wird er an den Anfang der folgenden Zeile gesetzt. 







Anhang 


263 


Kommando ; GoStringPos 
Abkürzung GoSPos 

Parameter p“=VALUE 

Return 
Funktion 

Positioniert den Cursor auf das Zeichen an Position p" der Zeichenkette der aktueUen Zeile. Die 
Position wird von 0 an gezählt. 


Kommando : GoDispPos 

■Abkürzung GoPos 

Parameter : p“=VALUE 

Return : 

Funktion 

Positioniert den Cursor in der aktuellen &ile auf Position p". p'^ wird in diesem Fall von 1 an 
gezählt und korrespondiert mit der Anzeige in der Titelleiste des Fensters. 

Kommando : Top 

Abkürzung T 

Parameter 
Funktion : 

Setzt den Cursor auf den Anfang der ersten Zeile des Textes. 


Kommando : Bot 
Abkürzung B 
Parameter : 

Funktion : 

Setzt den Cursor auf den Anfang der letzten Zeile des Textes. 







MaxonPASCAl. _ 

D-2 Verwalten von Texten 


Kommando 

NewText 

Abkürzung 

Funktion 

- 

Erzeugt einen neuen Text 

Kommando 

FreeText 

Abkürzung 

FTx 

Parameter 

Funktion 

- 


Gibt eien aktuellen Text frei. 


Kommando : PredText 
Abküntung PTx 
Parameter 
Funktion 

Waililt den Text vor dem aktuellen Text an oder, falls dieser der erste Text in der Liste war, den 
letzten. 


Kommando : SuccText 
Airkürzung STx 
Parameter : 

Funktion 

Vi'ahlt den Text nach dem aktuellen Text an oder, falls dieserder letzte Text in der Liste war, den 


ersten. 


Kommando : 

SelTextN 

Abkürzung 

STN 

Parameter 

p''=VALUE 

Funktion 



W^ählt Text Nummer p" aus der Liste vorhandener Texte aus. 









Kommando : New 
Abkür/ung New 
Parameter 
Funktion ; 

Löscht alle Zeilen des aktuellen Textes. 


Kommando : Print 

Abkürzung : Pr 

^ Parameter p"= STRING 
Funktion 

Der aktuelle Text wird in die durch p" angegebene Datei ausgegeben. Durch Angabe von 
pü=“ptr‘' wird auf den durch die Preferences eingestellten Drucker gedruckt. 






MaxonPASCAL 


266 


D-3 Dateioperationen 


Kümmando 

Abkürzung 

Parameter 

Funktion 


Save 

SA 

p"=OPT_STRING 


Speichern des aktuellen Textes. 

Wurde p“ angegeben, so wird der Text unter diesem Namen abgespeichert und als neuer Name 
des Textes übernommen, Wurde für p" ein Leer-String angebenen, so wird der Name des Textes 
über einen Dateiauswahlfenster vom Benutzer abgefragt. 

Wird p" nicht mitangegeben, so wird der Text unter seinem bisherigen Namen abgespeichert. 


Kommando 

Abkürzung 

Parameter 

Funktion 


Open 

Op 

p“=OPT_STRING 


Überladen des aktuellen Textes, Der aktuelle Text wird „vergessen“, und der durch p“ angegebe¬ 
ne Text wird geladen. Wird p" nicht oder nur ein Leer-String für p“ angegeben, so wird der Name 
des Textes über einen Dateiauswahlfenster vom Benutzer abgefragt. 


Kommando : InsertFUe 

Abkürzung InF 

Parameter p“=OPT_STRING 
Funktion 

Einfügen eines Textes in den aktuellen Text, Zu p“ gilt das bereits oben zu „Save“ und „Open“ 
Gesagte. 

Kommando : UpdateText 

Abkürzung UtX 

Parameter p'’=Value 

Funktion 

Speichert den Text mit der ID p“, falls er geändert aber ncK'h nicht gespeichert wurde. 







Anhang 


267 


Kommando UpdateTexts 

Abkiir/ung UtXs 

Parameter : 

Funktion : 

Speichert jeden Texte, der geändert aber noch nicht abgespeichert wurde. 


D-4 Blockoperationen 


Kommando : Mark 
Abkür7.ung Mk 
Parameter : 

Funktion : 

Aktiviert den Markierung.smodus Für normale Blöcke. Die Cursorposition bei Ausführung von 
„Mark“ wird als Block-Anfang benutzt. Die aktuelle Cunsorpositlon bei Ausführung einer 
Blockoperation gilt als Block-Ende. 

Erneutes Ausfuhren von „Mark“ bewirkt eine Desaktivierung des Markierungsmodus. 


Kommando : 

MarkVert 

.Abkürzung 

MV 

Parameter : 

- 

Funktion 



Aktiviert den Markierungsmotlus für Spaltenblöcke. Erneutes Ausführen von „MarkVert" bewirkt 
eine Desaktivierung des Markierungsmodus. 


Kommando : Cut 
Aliküreung X 
Parameter 
Funktion ; 

Schneidet dem markierten Block aus dem Text aus und kopiert ihn in das ClipBoard. Beendet 
den Blockmarkierungsmodus. Der Text vor dem ausgeschnittenen Bereich wird mit dem Text 
nach dem ausgeschnittenen Bereich ausammengefügt. 







MaxonPASCAL 


268 


Kommando 

Abkürzung 

Parameter 

Funktion 


Copy 

C 


Kopiert den markierten Block in das ClipBoard. Beendet den Blockmarkierungsmodus. 


Kommando : Paste 
•Abkürzung V 
Parameter 
Funktion 

Fügt den im ClipBoard gespeicherten Text an der momentanen Cursorposition ein. 
Anschließend wird der Cursor auf das letzte eingefügte Zeichen positioniert. 


Kommando : PasteVert 
Abkürzung PV 
Parameter 
Funktion 

Fügt die im ClipBoard gespeichene Textspalte korrekt an der momentanen Cursorposition ein. 
Anschliessend wird der Cursor auf das letzte eingefügte Zeichen positioniert. 


Kommando 

Abkürzung 

Parameter 

Funktion 


SaveClip 

SC 

p«=OPT_STRING 


Speichert Text aus dem ClipBoard in einer Datei mit Namen p". Wird p" nicht oder nur ein Leer- 
String für p" angegeben, so wird der Name der Datei über einen Dateiauswahlfenster vom 
Benutzer abgefragt. 


Kommando 

.Abkürzung 

Parameter 

Funktion 


OpenClip 

OC 

p"=OPT_STRING 


Ladt Text aus der durch p" angebenen Datei und kopien ihn in das ClipBoard. Wird p“ nicht 
oder nur ein Leer-String für p“ angegeben, so wird der Name der Datei über einen 
Dateiauswahlfenster vom Benutzer abgefragt. 







Anhang 


269 


Kommando : BlockSL 
Abkürzung BSl 
Parameter 
Funktion : 

Rückt alle markierten Zeile eines Blocks um eine Tabulatorweite nach links, falls vor jeder Zeile 
mindestens ein Tab-Zeichen, bzw, entsprechend viele Leerzeichen sind. 


Kommando 

Alrkiirzung 

Parameter 

Funktion 


BlockSR 

BSr 


Rückt alle markienen Zeile emes Blocks um eine Tabulatorweite nach rechts. 


Kommando : BlockLower 

Abkürzung BLo 
Parameter : - 

Funktion : 

Wandelt alle markierten Zeichen eines Blocks in Kleinbuchstaben um. 


Kommando : BlockHigher 
Abkürzung BHi 
Parameter 
Funktion 


Wandelt alle markierten Zeichen eines Blocks in Großbuchstaben um. 







MaxonPAJSCAl, 


270 


D-5 Suchen und Ersetzen 


Kommando 

■Abkürzung 

Parameter 

Funktion 


Find 

f 

p“= STRING 


Sucht ausgehend von der aktuellen Cursorposition die durch p'' angebene Zeichenkette im 
Text. Dabei wird solange in eine Richtung gesucht bis ein Vorkommen der Zeichenkette gefun¬ 
den werden konnte. Ansonsten wird die Suchrichtung umgekehrt und abgebrochen. 


Kommando 

■Abkürzung 

Parameter 

Funktion 


Rcplace 

r 


p“=STRING, p‘=STRING 


Sucht ausgehend von der aktuellen Cursorposition die durch p" angebene Zeichenkette im 
Text. Dabei wird solange in eine Richtung gesucht bis ein Vorkommen der Zeichenkette gefun¬ 
den werden konnte. Ansonsten wird die Suchrichtung umgekehrt und abgebrochen. 

Konnte p'^ gefunden werden, so wird sie durch die mit p' angegebene Zeichenkette ersetzt. 


Kommando : Again 
Abkürzung a 
Parameter 
Funktion : 

Wiederholt die letzte Such- bzw. Ersetzungsoperation. 


Kommando 

■Abkürzung 

Parameter 

Funktion 


ReplaceAU 

ra 

p"=STRlNG, p‘=STRlNG 


Ersetzt alle Vorkommen von p" im Text durch die Zeichenkette pf 






Anhang 


271 


Kommando ; RemTab 

AbkLii7.ung rt 

Parameter 
Funktion : 

Ersetzt alle Tabs im Text durcti entsprechend viele Spaces. 

Kommando : GoMalchStruct 

Abkürzung GMS 

Parameter 
Funktion : 

Der Cursor muß sich vor Ausführung von „GoMatchStruct“ auf einer beliebigen öffnenden oder 
schließenden Klammer befinden. „GoMatchStruct“ bewegt den Cursor dann auf die korrespon¬ 
dieren Klammer. 


Kommando : GoParsedEiror 
Abkürzung GPE 
Parameter 
Funktion : 

Der Cursor muß sich auf der Zeile einer von einem Compiler erzeugten Fehlerdatei befinden, in 
welcher der Dateiname und die Zeilennummer eines Fehlers stehen. „GoParsedError“ analysiert 
diese Zeile und prüft, ob die Datei, zu der die Fehlerbeschreibung gehört, sich schon im 
Speicher befindet. Ist dies nicht der Fall, so wird die entsprechende Datei nachgeladen. 
Daraufhin wird der Cursor auf die Zeile positionie«, in welcher sich der angebene Fehler befin¬ 
det. 


Kommando : Jump 
Abkürzung J 

Parameter p"=VALUE 

Funktion ; 

Positioniert den Cursor auf die durch p” angegebene Zeile. 






MaxonPASCAL 


272 


D-6 Strukturieren von Texten 

Kümmandn : Fold 
Abkürzung Fo 
Parameter 
Funktion 

Faltet einen markierten Block zusammen. 


Kommando 

Al)kürzung 

Parameter 

Funktion 


ShowFold 

SF 


Befindet sich der Cursor auf einer geschlossenen Falte, so wird diese hierdurch geöffnet. 


Kommando : RemFold 
Abkürzung rf 
Parameter 
Funktion 

Befindet sich der Cursor auf der ersten Zeile einer Falte, so wird die Falte durch .,RemFold“ 
geöffnet, und die Faltenmarkierungen werden entfernt. 


Kommando : SetFoldsOff 
Abkürzung SFO 
Parameter 
Funktion 

Sorgt dafür, daß geschlossene, gefaltete Bereiche mit allen Zeilen genau wie geöffnete, gefaltete 
Bereiche dargestellt werden. 


Kommando : SetFoldsOn 
Abkürzung SFl 
Parameter 
Funktion 

Macht „SetFoldsOff' rückgängig. Danach werden nur noch explizit mit „ShowFold" geöffnete 
Falten auch als geöffnet daigestellt. 








Anhans 


273 


Kommando GoPredFold 

,\bküi7ung GPF 

Parameter 
Funktion 

Bewegt den Cursor auf den niiehstliegenden Faltenanfang oder das näcfistliegende Faltenende 
vor der aktuellen Zeile. 


Kommando ; GoSuccFold 
Abkür/tung GSF 
Parameter : 

Funktion 

Bewegt den Cursor auf den nächstliegenden Faltenanfang oder das nächstliegende Faltenende 
nach der aktuellen Zeile. 


Kommando : ToggleKey 
Abküraung TK 
Parameter 
Funktion 

Ändert den Auszeichnungsstatus der aktuellen Zeile. Ist diese ausgezeichnet, so wird die 
Au.szeichnung gelöscht und umgekehrt. 


Kommando : GoPredKey 
■Abkürzung GPK 
Parameter 
Funktion 

Bewegt den Cursor auf die nächste vor der aktuellen Zeile liegende Zeile, die au.sgezeichnet ist. 


Kommando : GoSuccKey 
Abkürzung GSK 
Parameter 
Funktion 

Bewegt den Cursor auf die nächste der aktuellen Zeile folgende Zeile, die ausgezeichnet ist. 








MaxonPASCAL 


274 


Kommando : SetBookMark 
Abküßung SBM 

Parameter p“=VALUE 

Funktion 

Belegt daa Lesezeichen mit der Nummer p" mit einem Verweis auf die aktuelle Zeile, so daß die¬ 
se einfach wieder angesprungen werden kann. 


Kommando : GoBookMark 
Abkürzung GBM 

Parameter p°=VALUE 

Funktion 

Sucht, ob das Lesezeichen mit der Nummer p“ einen Verweis auf eine Zeile enthält und positio¬ 
niert dann den Cursor auf diese. 




AnhanB 


275 


D-7 Ändern von Optionen für den aktuellen Text 


Kommando : SetTab 
Abkürzung 

Parameter p"=VALUE 
Funktion : 

Setzt die Tabulator-Weite auf p". p" mulS im Bereich von 1 bis 20 liegen. 


Kommando : SetOverOn 

.Airkürzung SOI 

Parameter : 

Funktion 

Aktiviert den „OverWrite“-Modu.s. 

Kommando : SetOverOff 

Abkürzung SOO 

Parameter : 

Funktion : 

De.saktiviert den „OvcrWrite“-M(xlus. 


Kommando : SetWrap 
.Airkürzung SWr 

Parameter p''=VALUE 

Funktion 

Setzt den rechten Rtind für den Umbruch im „Word-Wrap“-Modus auf p“. p" muß größer als 9 
.sein. 

Kommando : SetWrapOn 
Abküizung swl 

Parameter 
Funktion 

Aktiviert den ,,Word-WTap“-M(rdus. 







MaxonPASCAL 


276 


Kommando : SetWrapOff 
Abkürzung swO 
Parameter 
Funktion 

Desaktiviert den „Word-V!'rap“-Modus. 


D-8 Word-Wrap 


Kommando : WrapPara 
Abkünung WrP 
Parameter 
Funktion 

Formatiert den aktuellen Absatz gemäß den Einstellungen für den „Word-Wrap“ um. 


Kommando : WrapText 
Abkürzung WrT 
Parameter 
Funktion : 


Formatiert den aktuellen Text gemäß den Einstellungen für den „Word-Wrap" um. 






Anhang 


277 


D-9 Makros 


Kommando : RecStart 

Al)küi7ung rst 

Parameter 
Funktion : 

Leitet die Aufzeichnung eines Makros ein. Das zuletzt aufgezeichnete Makro geht dadurch verlo¬ 
ren. 

Kommando : RecStop 

Abkürzung rsp 

Parameter 
Funktion 

Beendet die Aufzeichnung eines Makros. 

Kommando : RecPlay 

Abkürzung RP 

Parameter 
Funktion 

Spielt ein aufgezeichnetes oder eingeladenes Makro ab. 


Kommando : SaveRecScript 
Abkürzung SRS 

Parameter p“=OPT_STRING 

Funktion : 


Speichert ein aufgezeichnetes Makro in einer Datei mit Namen p” ab. 

Wird p“ nicht oder nur ein Leer-String für p" angegeben, so wird der Name der Datei über einen 
Dateiauswahlfenster vom Benutzer abgefragt. 


Kommando 

Abkürzung 

Parameter 

Funktion 


PlayRecScript 

PRS 

p"=OPT_STRING 








MaxonPASCAL 


278 


Lädt die durch p" angegebene Makro-Datei ein, interpretiert diese und fuhrt sie aus. Wird p” 
nicht oder nur ein Leer-String für p“ angegeben, so wird der Name der Datei über einen 
Dateiauswahlfenster vom Benutzer abgefragt. 


D-10 Fenster 


Kommando : NewWin 
.Abkürzung NW 
Parameter 
Funktion 

Eröffnet ein neues Fenster. 


Kommando : FreeWin 
Allkürzung FW 
Parameter 
Funktion 

Schließt das aktuelle Fenster. Falls das aktuelle Fenster das letzte Fenster Edw'ards war, so wird 
Edw'ard beendet. 


Kommando : PredWin 
Abkürzung PW 
Parameter : 

Funktion 

Wählt das Window vor dem aktuellen Window an oder, falls dieses das erste Window in der Li.ste 
war, das letzte. 


Kommando ; SueeWin 
Aliküaung SW 
Parameter 
Funktion : 

Wählt das Window nach dem aktuellen Window an oder, falls dieses das letzte Window in der 
Liste war, das erste. 







Anhang 


279 


Kommando : SplitHorWin 
Abkürzung SHW 
Parameter 
Funktion 

Teilt das aktuelle Fenster horizontal in zwei gleichgroße Fenster auf. 


Kommando SplitVerWin 

Abkürzung SVW 

Parameter 
Funktion 

Teilt das aktuelle Fenster vertikal in zwei gleichgroße Fenster auf 


Kommando ; FuUSizeWin 
Allkürz,ung FSW 
Parameter 
Funktion 

Vergrößert das aktuelle Fenster auf maximale Ausmaße. 


D-11 Verlassen des Editors 

Kommando : Exil 
.Abkürzung Xlt 
Parameter 
Funktion 

Edward verlassen. Informationen zur Aufnahme der Arbeit in derselben Umgebung, wie vor 
dem Aufruf von „Exit“ werden gespeichert. 


Kommando ; Quil 
Abkürzung Q 
Parameter 
Funktion 


Edward sofort verlassen. 








MaxonPASCAL 


280 


D -12 Formulare 


Kommandü : FindForm 
Abkürzung FFm 
Parameter 
Funktion 

Öffnet das Such-Formular. 


Kommando FindRepForm 

Abkürzung FRFm 

Parameter 
Funktion 

Öffnet das Formular zum Suchen und Ersetzen, 


Kommando : GotoFonn 
Abkürzung GFm 
Parameter 
Funktion 

Öffnet das Formular, mit welchem eine spezielle Zeile angesprungen werden kann. 


Kommando : GlobalForm 
Abkürzung GFm 
Parameter 
Funktion 

Öffnet das Formular für die globalen Einstellungen. 


Kommando : PageFonn 
Airkürzung PFm 
Parameter 
Funktion 

Öffnet das Formular, in welchem den Ausdruck von Texten betreffende Einstellungen votge- 
nommen werden können. 








Anhang 


281 


Kommandü : EditFonn 
Abkürzung EdFm 
Parameter : 

Funktion : 

Öffnet das Formular, mit dem den aktuellen Text betreffende Einstellungen vorgenonimen wer¬ 
den können, 


Kommando : InfoForm 
Abkürzung InfFm 
Parameter : 

Funktion : 

Öffnet das Formular mit Informationen über Edw'ard, 


D-13 Der Kommandozeilen-fnterpreter 


Kommando : RepeatCnid 
Abkürzung RpCmd 
Parameter : 

Funktion 

Führt die zuletzt eingegclxme Kommandozeile erneut aus. 


Kommando : EnterCnid 
Abkürzung ECmd 
Parameter 
Funktion 


Wechselt in den Fangabemodus ftir die Kommandozeile. Ist dieser Eingabemodus aktiv, so 
bricht erneutes Ausführen von „EnterCmd“ den Eingabemodus ab, ohne daß die eingebene 
Zeile ausgeführt wird. 









MaxonPASCAL 


282 


Kümmandu : ModilyOldCmd 
Abkürzung MCmd 
Parameter 
Funktion : 


Wechselt in den F-ingabemtxlus für die Kommandozeile, wobei die zuletzt eingegebene 
Kommandozeile erneut zur Bearbeitung bereitgestellt wird. Ist dieser Eingabemodus aktiv, so 
bricht erneutes Ausfuhren von „ModilyOldCmd“ den Eingabemodus ab, ohne daß die eingebe- 
ne Zeile ausgeführt wird. 


Kommando : Do 
Abkürzung Do 

Parameter p''=VALUE, p'=CMDUST 

Funktion 

Führt die durch p' angegebene Kommandofolge p“-mal aus. 


D-14 Ändern von globalen Einstellungen 


Kommando : Display 
Abkürzung Dsp 

Parameter p“=VALUE 

Funktion 

Durch „Display“ wird der Screen gewählt, auf welchem die Fenster von Edward erscheinen sol¬ 
len. Dabei.sind die Werte von p" folgendermaßen zugeordnet; 

0 = Workbench-Screen 

1=4 farbiger Screen, Hires 

2=4 farbiger Screen, Hires-lnterlaced 

Übrigens - sollten Sie einmal einen anderen Screen als den Workbench-Screen eingeschaltet 
haben, bekommen Sie Edward nur mit dem Kommando DSP 0 wieder zurück auf den 
Workbench-Screen. 






283 


Anhang 

Kommando : 

Font 

Allkürzung 

Fnt 

Parameter 

p''=STRING, p'=VALUE 

Funktion 



p" muß den Namen eines Zeicliensat7X-s angeben (Bsp. „topaz.font“). p‘ gibt die gewünschte Größe 
des Zeichensatzes an. Bei der Auswahl der Zeichensätze gelten gewisse Einschränkungen. So sind 
z.B. keine proportionalen Zeichensätze möglich. Sollte Edward aus irgendeinem Grund einen 
gew'ünschten Zeichensatz, für ungeeignet halten, so wird der zuvor eingestellte Zeichensatz weiter¬ 
hin verwendet. 


Kommando : AuloMode 
Allkürzung Auto 

Parameter : p“=VALUE, ])'=OPT_VALUE 

Funktion 

p" wählt das Verfahren für den Auto-Save, p' gibt optional die Zeitspanne in Sekunden zwischen 
zwei Sicherungen an. p' muß einen Wert größer oder gleich 30 haben. 

Die Werte von p" entsprechen folgenden Modi: 

0 = Auto-Save OFF 

1 = Auto-Save (automatisch speichern, ohne Bestätigung) 

2 = Conflrm Auto-Save (automatisch speichern, aber erst nach Bestätigung) 


Kommando 

Abkürzung 

Parameter 

Funktion 


OpenDeüs 

OD 

p“=OPT_STRING 


Die Definition der Menüs, Tastaturbelegung, des HotKeys, etc. wird aus der durch den String pO 
spezifizierten Datei geladen. Wird kein String angegeben, so öffnet sich ein 
Dateiau.swahlfenster, mit dem eine Datei gewählt w'erden kann. 






MaxonPASCAL 


284 


D-15 ARexx - Kommunikation mit Edward 


Kommando 

Abkürzung 

Parameter 

Funktion 


ExecRexx 

RX 

p“=OPT_STRING 


Führt die durch p" angebene Datei als Rexx-Programm aus. Wird p" nicht oder nur ein Leer- 
String für p" angegeben, so wird der Name der Datei über einen Dateiauswahlfenster vom 
Benutzer abgefragt. 


Kommando ExecRexxStiing 

Abkürzung RXS 

Parameter p“=STRING 

Funktion 

Führt den übergebenen String p“ als kleines Rexx-Programm aus. 


D-15.1 Abfrage von Statuswerten Edwards : 

Kommando : GetWord 

Abkürzung GWd 

Parameter 

Return SMALL_STRING 

Funktion 

Uefert das Wort, auf welchem sich der Cursor befindet zurück. 

Kommando ; GetlineString 

Abkürzung LineString 

Parameter 

Return STRING 

Funktion 

Gibt den Inhalt der aktuellen Zeile zurück. 






Anhang 


285 


Kommando : 

GetTextPos 

Abkürzung 

TextPos 

Parameter : 

- 

Return 

LIST „(LineNum, DispPos, DispLineNum, EdStringPos, Fold, 
FoldStart, FoldEnd, Key, EndLF, EndEOS)“ 

Funktion 



Liefert eine Liste, die die Position im Dokument und Status-Informationen enthält, 

Autbau der Liste: 

• Zeilennummer; ergibt sich durch .Abzählen aller Zeilen vom Textanfang an, 

• Spaltenposition 

• Zeilennummer; ergibt sich durch Airzählen nur der sichtbaren Zeilen (d,h,: die eingefalteten 
Zeilen werden nicht mitgezählt), 

• Position im String der aktuellen Zeile, die mit der Spaltenposition korrespondiert. Enthält ein 
String TAB-Zeichen, so können sich die Spaltenposition und die String-Position untentcheiden, 
da ein Tab für die Spaltenposition normalerweise wie mehrere Leerzeichen gezählt wird, 

• Fold, Flag; gibt an, ob die Zeile eingefaltet ist, 

• FoldStart, Flag; gibt an, ob die Zeile der Beginn einer Falte ist, 

• FoldEnd, Flag; gibt an, ob die Zeile das Ende einer Falte ist, 

• Key, Flag; gibt an, ob die Zeile ausgezeichnet wurde, 

• EndLF, Flag; gibt an, ob die Zeile mit einem LineFeed (ASCII 10) endet, 

• EndEOS, Flag; gibt an, ob die Zeile mit einem EOS (ASCII 0) endet, 

Kommando : GetTextList 
Allkürzung TextList 

Parameter : 

Return LIST „([TextName ID]*)“ 

Funktion 

Liefert eine Liste aller geladen Texte und ihrer IDs, 


Kommando GetWindowList 

Ahkür7,ung WindowList 

Parameter 

Return : LIST „([WindowID TextID Lefit Top Width Height]*)“ 

Funktion 

Liefert eine Liste mit IDs aller geöffneten Windows, sowie dazugehörigen Informationen (ID des 
dargestellten Textes, Position und Ausmaße des Fensters), 







MaxonPASCAL 


286 


Kommandi) GetBlocklnfo 

Alikür/ung Blocklnfo 

Parameter 

Return : LIST „(Block, MarkVert, LineNum, DispPos, StringPos)“ 

Funktion 

Gibt Informationen über einen möglichen^’eise markierten Block zurück. Ein markierter Block 
wird immer durch die zu Beginn markierte Zeile und die aktuelle Zeile definiert. 

Die Uste enthält folgende Werte: 

• Block; Flag. Gibt an, ob ein Block markiert ist. Ist dieses Flag 0, so gelten alle folgenden 
Informationen nicht. 

• MarkVert; Flag. Gibt an, daß der Benutzer einen Spaltenblock markieren will. 

• LineNum. Zeilennummer der Zeile, an der die Markiening beginnt (diese kann über-, aber auch 
unterhalb der aktuellen Zeile liegen). 

• DispPos. Spaltenposition des Markierungsbeginns. 

• StringPos. Zu DispPos korrespondierende Position im String der Zeile, an der die Markierung 
beginnt. 


Kommando : GetTextlnfo 

Altkürzung Textinfo 
Parameter 

Return : LIST „(TotalLines, DispLines, FoldedLines, UseFold, DoWrap, 

Over, LockCnt, Changes.)“ 

Funktion 

Liefert allgemeine Informationen ülx;r den aktuellen Text. 

Aufbau der Liste: 

• TotalLines; Anzahl aller Zeilen des Textes 

• DispLines; Anzahl der momentan darstellbaren Zeilen. 

• FoldedLines; Anzahl der eingefalteten Zeilen. 

• UseFold; Flag. Gibt an, ob Zeilen innerhalb von Falten dargestellt werden soUen ( 0 ) oder 
nicht( -1). 

• DoWrap; Flag. Gibt an, ob der WordWrap-Modus eingeschaltet ist. 

• Over; Flag. Gibt an, ob der OverWrite-Modus eingeschaltet ist. 






Anhang 


287 


• LockCnt; Zähler, wie oft der Text geiocked wurde. Ist er ungleich 0, so kann der Text nicht 
modifiziert werden. Der Ixx'kCnt wird hochgezählt, wenn der Text gedruckt werden soll, oder 
TextReads auf den Text ausgeführt wertien. 


Kommando : GetScreenlnfo 
Abkürzung Screenlnfo 

Parameter : 

Return LIST „(Width Height Depth ScreenAdr)“ 

Funktion 

„Screenlnfo“ gibt folgende Werte in einer Liste zurück: 

Breite, Höhe, Tiefe und Adresse des Screens, auf welchem Edward seine Fenster darstellt. 


D-15.2 Laden von Texten aus Edward heraus 

Mit den folgenden Befehlen ist ein Zugriff auf im Speicher befindliche Texte Edwards auf einfache 
und schnelle Weise möglich. 

Zu beachten ist hier vor allem, daß ein von einer externen Applikation mit InitTextRead geöffneter 
Text bis zum Abschluss der TextRead- Operationen durch EndTextRead nicht verändert werden 
kann; der Text ist gesperrt („gelückcd“). 

Solange nicht alle InitTextReads durch entsprechende EndTextReads abgeschlossen wurden, kann 
zudem Edward nach einem Beenden nicht aus dem Speicher entfernt werden. 

Es ist selbstverständlich möglich, mehrere InitTextReads auf den.selben Text auszuführen. 


Kommando 

Abkürzung 

Parameter 

Return 

Funktion 


InitTextRead 

ITR 

p"=STRING 
Handle=VALUE 


Versucht Text mit Namen pO zu finden. Ist dieser vorhanden, so wird er geiocked und ein 
Handle für w'eitere Operationen erzeugt. Die erste Zeile des Textes ward zur aktuellen Zeile für 
kommende TextRead-Operationen. Das Handle wird zurückgegeben. 




MaxonPASCAL 


288 


Kommando 

Abküniung 

Parameter 

Return 

Funktion 


TextRead 

TR 

Handle=VALUE, Bu£fer=VALUE, BuffSize=VALUE 
RealRead=VALUE 


Kopiert von der für diesen TextRead aktuellen Zeile den Inhalt dieser und der folgenden Zeilen 
in den Buffer. Dabei werden Zeilen immer komplett kopiert. Sollte eine Zeile nicht mehr ganz 
in den Buffer passen (daher muß BuffSize angegeten werden), so w'ird die Kopieraktion been¬ 
det. 

Daraufhin wird die Anzahl der kopierten B«e.s z.uriickgegelien (RealRead). Das Lesen ist been¬ 
det, w'enn RealRead gleich 0 ist. 


Kommando : EndTextRead 

Abkürzung ETR 

Parameter Handle=VAI.lIE 

Return : - 

Funktion 

Der durch ein „InitTextRead“ gelockte Text wird wieder unlocked. Das Handle wird freigege¬ 
ben. 


D-16 UnDo/ReDo - Zurücknehmen von Textänderungen 


Kommando : UnDo 

.Abkürzung UnDo 

Parameter : 

Funktion : 

Nimmt die letzte Änderung am Text zurück. 

Kommando : ReDo 

Abkürzung ReDo 

Parameter : 

Funktion : 

Nimmt die Rücknahme der Rückname der letzten Textänderung zurück. 

(Gut, das ist nicht gerade leichverständlich, aber Sie können ja noch einmal in das 
Referenzkapitel blättern. Noch besser ist. Sie probieren es einfach aus.) 






iVnhans 


289 


D-17 Verschiedenes 


Küinmanclo : ExecCli 
.'Vbkürzung Exe 

Parameter p"=STRING 

Funktion : 

Führt das Programm mit Namen p" aus, 


Kommando : InsertChars 

Abkuryaing : IC 

Parameter p'’= STRING 

Funktion 

Fügt die durch p" spezifizierten Zeichen an der aktuellen Cursorposition ein. Dieses Kommando 
\sairde für Makros und die ARexx-Kommunikation eingeführt. 

Kommando : SetModel, SetMode2, SetMode3 

.Airkürzung : SMl, SM2, SM3 

Parameter 
Funktion : 

Sorgt dafür, daß die nächste Tastatureiitgabe gemäß Modus 1 interpretiert wird. 


Kommando : Iconify 
Abkürzung Ify 
Parameter ; 

Funktion 


Schließt alle Fenster Edwards. Ein neues Fenster, das nur aus einer Titelzeile besteht erscheint 
anschließend. Wird dieses Fenster aktiviert und die rechte Maustaste gedrückt, so werden alle 
Fenster Edwards wieder an ihren ursprünglichen Positionen geöffnet. Edward kann ebenfalls 
durch den HotKey oder dtis Senden einer Nachricht über ARe.xx „geweckt" w-erden. 







MaxonPASCAL 


290 


E) Editor-Fehlermeldungen. 


Beim Arbiter) mit Edward werden Sie bei wichtigen Problemen, die sich ergeben können, augen¬ 
blicklich informien und erhalten in den meisten Fällen die Möglichkeit, auf diese Informationen zu 
reagieren, ln der Regel handelt es sich hier um Sicherheitsabfragen, um zu verhindern, daß Sie z.B. 
aus Versehen einen noch nicht abgespeicherten Text löschen. 


E-1 Informationen 

Meldung : „Markierung gesetzt“ 

Ursache : Sie haben die aktuelle Zeile mit einem Lesezeichen belegt, um sie demnächst leicht 
wieder anspringen zu können. 

Referenz : Kapitel 3.7.4 Lesezeichen 


E-2 Allgemeine Fehlermeldungen 

Meldung : „Text ist geschützt“ 

Ursache : Sie wollten den Text verändern, dieser ist aber gesperrt. Ein Text wird gesperrt, wenn 
er gedruckt werden soll, oder der Befebl „InitTextRead“ auf ihn ausgeführt wurde. 

Abhilfe : Warten, bis der Text gedruckt wurde. 

Vielleicht wird auch gerade ein AEe,xx-Makro auf diesen Text ausgeführt, dann heißt es 
ebenfells abwarten. 

Referenz : Kapitel IV. 5) Drucken eines Textes 

Kapitel 3.17 ARexx - Kommunikation mit Edward 

Meldung : „Kein Pictogramm vorhanden“ 

Ursache : Wenn Sie im Formular für die globalen Einstellungen „Configuration Icon“ gewählt 
haben, versucht Edward zu jedem Text, den Sie erzeugen, eine „.info“-Datei zu schrei¬ 
ben. Diese Datei enthält unter anderem Informationen, damit die Workbench ein 
Pictogramm zu Ihrem Text darstellen kann. Existierte bisher keine „.mfo"-Datei, so 
erzeugt Edward eine Standard-Datei. Dazu benötigt er im Verzeichnis „Edward:“ ie 
Datei „EdwardDefault.üifo“. Diese haben Sie anscheinend gelöscht. 



Anhang 


291 


.Atihilfe : Kopieren Sie von der mitgelieferten Diskette die Datei „EdwardDefault.info" wieder in 
Ihr ,Edward:“-Ver/eichnis, sollte Ihnen das zu kompliziert erscheinen müssen Sie 
Edward komplett neu installieren (Achtung: Dabei können möglicherweise verschiede¬ 
ne von Ihnen vorgenommene Voreinstellungen für Edward verloren gehen). 

Referenz : Kapitel 3.15 „Globale Einstellungen“ 

.Meldung : .Abbruch! Konnte Backup nicht erzeugen!“ 

Ursache : Sie w'ollten einen Text speichern. Beim Anlegen der Backup-Datei Ihres Textes trat ein 
Fehler auf 

Möglicherweise haben Sie einen ungültigenPfad für die Backup-Datei angegeben. 
Vielleicht ist auch nur das Laufwerk oder die Platte voll, auf welcher Sie die Backup- 
Datei anlegen lassen wollten. 

Abhilfe : i’lberprüfen Sie den Pfad-Namen, den Sie für die Backup-Datei im „Global Prefs“- 
Formular angegeben haben. 

Versichern Sie sich, daK auf dem durch den Pfad angegebenen Medium genügend 
Speicherplatz vorhanden ist. 

Referenz ; Kapitel 3.15 „Globale Einstellungen“ 

Meldung : „Markierung nicht gesetzt!“ 

Ursache : Sie haben versucht ein Lesezeichen anziispringen, das noch nicht definien wurde. 

Abhilfe : Vielleicht haben Sie nur die falsche Taste gedrückt, dann sollten Sie es einfach nochmal 
versuchen. 

Referenz : Kapitel 3.7 „Strukturieren von Texten - I^sezeichen“ Abschnitt 4) 

Meldung : „Kein Block definiert!“ 

Ursache : Sie haben versucht eine Block-Operation auszufuhren (Cut, Copy, Paste, etc.) , zuvor 
jedoch keinen Bkxk definiert. 

Abhilfe : Einfach den gewünschten Text-Bereich markieren und nochmal versuchen. 

Referenz : Kapitel 3.5. „Blockoperationen'' 

Meldung : „Abbruch! Funktion würde FJnfaltung zerstören!“ 

Ursache : Im allgemeinen wird diese Meldung ausgegeben, wenn Sie einen Block ausschneider 
wollten, der nur teilweise eine Text-Falte überdeckt. Bei einer solchen Operation wür 



MaxonPASCAL 


292 


Abhilfe 

Referenz 

Meldung : 
Ursache : 

Abhilfe : 
Referenz : 

Meldung : 

Ursache : 

Abhilfe : 


Referenz : 

Meldung : 
Ursache : 


de nur der Anfang bzw. das Ende der Textfalte ausgeschnitten, was die Falte zerstören 
würde. Deshalb unterbindet Edward solche Aktionen. 

Sie können eine Textfalte nur komplett ausschneiden. Sollten Sie tatsächlich nur einen 
Teil der Textfalte ausschneiden wollen, so müssen Sie die Faltung erst rückgängig 
machen, bevor Sie diesen Teil ausschneiden können. 

Kapitel 3.5 „Blockoperationen“ 


„Zeichenkette zu langt“ 

Aus internen Gründen kann Edward maximal 512 Zeichen in einer Zeile verwalten. 
Beim Einfügen von Zeichen durch eine „Paste“-Operation könnte diese Grenze mögli¬ 
cherweise überschritten werden, was fatale Fehler hervorrufen würde. Daher stoppt 
Edward hier das Einfügen und gibt obige Meldung aus. 

Die „Paste"-Operation in einer leeren Zeile ausführen. 



Kapitel 3-5 „Blockoperationen“ 


„Suchjuuster nicht gefunden!“ 


Beim Suchen oder Ersetzen konnte das von Ihnen angegebene Suchmuster nirgendwo 
im Text entdeckt werden. 

Suchvorgang wiederholen. Edward durchsucht den Text immer von der aktuellen 
Position aus entweder zum Anfang oder zum Ende hin nach dem Suchmuster. Konnte 
dieses nicht gefunden werden, so kehrt er die Suchrichtung um. Daher kann unter 
Umständen nach dem Fehlschlagen einer Suchaktion durch eine Wiederholung des 
Suchvorgangs doch noch etwas gefunden w'crden. Schlägt dieser Suchvotgang ebenfalls 
fehl. Dann ist beim besten Willen nichts zu finden. 

Vielleicht verbirgt sich eine Zeile, deren Inhalt dem Suchmuster entsprechen würde, in 
einer Textfalte, dann konnte Edward hier ebenfalls nichts finden. Wählen Sie „Show All 
Folds“ aus dem ..Folds“-Menü und wiederholen Sie den Suchvorgang. 

Kapitel 4.6. „Suchen und Ersetzen“ 


„Cursor steht auf keinem Stnikturelement“ 

Beim Aufruf von „Match Bracket“ aus dem „Search“-Menü stand der Cursor auf keiner 
Klammer. 


Anhani 


293 


Abhilfe : Positionieren Sie eien Cursor auf eine Klammer. Wahlen Sie dann erneut „Match 
Bracket“. 

Referenz : Kapitel 3.6. „Suchen und Ersetzen“ 

Meldung : „Strukturen stimmen nicht überein!“ 

Ursache : Nach dem Aufruf von „Match Bracket“ aus dem „Search'‘-Menü konnte Edward keine 
korrespondierende öffnende bzw. schließende Klammer finden. 

Abhilfe : Überprüfen Sie Ihren Text genau. Sie haben sicher irgendwo eine Klammer vergessen. 

Referenz : Kapitel 3.6 „Suchen und Ersetzen“ 

Meldung : ,aVUes ist rückgängig gemacht worden!“ 

Ursache : Sie haben „Undo“ aus dem „Extra.s“-Menü so oft ausgewählt, daJS es nichts mehr rück¬ 
gängig zu machen gibt. 

Abhilfe : W'ählen Sie doch mal eine andere Funktion aus und bearbeiten Sie Ihren Text wieder. 

Na ja, ' mal ganz ernsthaft. Die obige Meldung Ist eigentlich eher als Hinweis denn als 
Fehler zu werten. Nehmen Sie sie einfach zur Kenntnis. 

Referenz : Kapitel 3.18 „Zurücknehmen von Text-Änderungen“ 

Meldung : „Alles ist wiederhergestellt worden!“ 

Ursache : Sie haben alle Rücknahmen von Text-Änderungen wieder zurückgenommen, das heißt, 
Ihr Text sieht wieder genauso aus, wie vor dem ersten Aufruf von „Undo“. 

Abhilfe : Siehe oben. 

Referenz : Kapitel 3-18 „Zurücknehmen von Text-.Änderungen“ 

Meldung ; „Menü ist zu groß für den Screen! Nutze Default Einstellungen!“ 

Ursache : Ihr Systemfont ist derart hoch, daß meist die Höhe des Menüs (in seltenen Fällen wird 
das Menü so breit, dalJ es in der horizontalen nicht meirr paßt) größer wird, als auf dem 
Screen angezeigt werden kann. 

Airhilfe : Sie sollten keine tJbertrieben großen Fonts verwenden, um noch etwas auf Ihrem 
Monitor erkennen zu können. Kaufen Sie sich besser einen größeren Monitor! 


MaxonPASCAL 


294 


E-3 Fehlermeldungen mit Abfragen 

Meldung : „[l][Vorsicht: Kein Speicher mehr! | Texte entfernen| oder Programm verlas- 
sen.][OK]“ 

Ursache : Edward hat leider nicht genügend Speicher bekommen. 

Abhilfe : Sicherheitshalber sollten Sie alle Texte erst einmal abspeichem. Wenn Sie dann einen 
oder mehrere der mttmentan nicht mehr benötigten Texte löschen, dann haben Sie für 
‘s erste genügend Speicher zum Weiteratbeiten. Sollte diese Meldung öfter auftreten, 
dann ist der Kauf einer Speichererweiterung mehr als nur ratsam. 


E-4 Meldungen mit Abfragen 

Meldung ; „Geänderten Text verwerfen ? 

[Ja] [Nein]“ 

Ursache : Sie wollten eine Operation vornehmen, deren Ausführung dazu führen würde, daß der 
momentan aktuelle Text verloren geht (z.B.: „Open“ aus dem „Projekf'-Menü oder 
„Neu“ bzw. „Frei“ aus dem „Text“-Menü). 

Falls dieser Text von Ihnen verändert, aber nicht abgespeichert wurde, so erfolgt diese 
Meldung. Wenn Sie „Nein“ wählen, so wird die Operation abgebrochen und Sie können 
den Text danach abspeichern, bei ,Ja“ geht dieser Text unwiederbringlich verloren. 

Abhilfe : Vor einer der oben erwähnten Operationen den Text abspeichem. Dies ist allerdings 
nicht zwingend notwendig. Die obige Meldung dient ja gerade dazu. Schlimmeres zu 
verhindern, wenn Sie das Abspeichem einmal vergessen sollten. 

Referenz : Kapitel 3-3 „Text", Kapitel 3.4 „Dateioperationen“ 

Meldung : „Geänderten Text verwerfen ? 

[Ja] [Nein]“ 

Ursache ; Sie wollten Edward beenden, Itaben aber noch nicht alle geänderten Texte abgespei¬ 
chert. 

Abhilfe : Wählen Sie ,Ja“, dann wird Edward beendet und alle von Ihnen bearbeiteten Texte wer¬ 
den nicht abgespeichert und gehen verloren. Da dies normalerweise nicht gewünscht 
ist sollten Sie „Nein“ wählen und dann die entsprechenden Texte abspeichem. 

Referenz : Kapitel 3-4 „Dateioperationen“ 


Anhang 


295 


Meldung ; .Altes Pictogramm ersetzen ? 

Ua] [Nein]“ 

Ursache : Sie haben eine I>atei ^arbeitet, zu der ein Icon existiert, das nicht von Edward erzeugt 
ftoirde. Dies ist z.B. möglich, wenn Sie eine Script-Datei eines anderen Programmes 
bearbeiten. Da viele Programme in der „.info“-Datei die das Icon enthält wichtige 
Zusatzinformationen speichern (diese können Sie sich durch einfaches Anklicken des 
Icons und Wahl des Menüpunktes „Info“ aus einem Menü der Workbench anzeigen las¬ 
sen) sollten Sie bei dieser .Meldung vorsichtshalber „Nein“ wählen. Nur wenn Sie ganz 
sicher sind, daß die „.info“-Datei keine wichtigen Informationen enthält wählen Sie ,Ja“, 
dann überschreibt Edward diese Datei mit seiner eigenen „.info''-Datei, die 
Informationen über das gerade bearbeitete Dokument enthält. 

Althilfe : Vergewissern Sie sich vor der Bearbeitung einer Datei, ob eine „.info“-Datei zu Ihr exi¬ 
stiert und ob diese von Edward oder einem fremden Programm erzeugt wurde. Ist letz¬ 
teres der Fall, so sollten Sie mit dem „Info“-Menü der Workbench erkunden, ob diese 
Datei irgendwelche wichtigen Zusatzinformationen enthält. 

Referenz : Kapitel 3-4 „Dateioperationen“, 

Kapitel XVI. „Globale Einstellungen“ Abschnitt I) „Das 'Global Prefs’-Formular“ 

Meldung : „Datei speichern : ‘Name’ 

IJalNein]“ 

Ursache : Sie haben im „Global Prefs“-Formu]ar die Option „Confirm Autosave“ eingestellt. Dies 
bedeutet, daß Edward nach dem von Ihnen eingestellten Zeitintervall alle Texte über¬ 
prüft und dann versucht, die geänderten Texte abzuspeichern. Vorher holt er sich 
jedoch von Ihnen über obige Meldung die Erlaubnis. 

Abhilfe : Wenn Sie diese Abfrage stört, dann wählen Sie statt „Confirm Auto-Save“ die Option 
,Auto-Save“, dann werden geänderte Texte automatisch ohne Rückfrage gespeichert. 

Referenz : Kapitel 3.15 „Globale Einstellungen“ Abschnitt 1) „Das 'Global Prefs’-Formular“ 

Meldung : „Datei existiert bereits 
Überschreiben? 

[Ja] [Nein]“ 

Ursache : Vermutlich haben Sie nach Wahl des Menüpunktes „Speichern als...“ aus dem „Projekt“- 
Menü im Datei-Auswahlfenster den Namen einer Datei gewählt, die schon existiert. 
Diese würde von momentan aktuellen Text überschrieben, wenn Sie ,Ja“ wählen und 


MaxonPASCAL 


296 


j'inge auf ewig verloren. Um dies zu verhindern erfolgt die Rückfrage Edwards. Wenn 
Sie sicher sind, tlaß sie die schon existieren Datei überschreiben wollen, dann wählen 
Sie ,Ja". Normalerweise Lst es wohl sinnvoller ..Nein“ zu wählen und sich die entspre¬ 
chende Datei erst einmal genauer anzuschauen. 

Referenz : Kapitel .14 „Dateioperationen'' 


E-S Fehler bei Betriebssystemoperationen 

■Meldung : „Kein Speicher mehr!“ 

Ursache : Sie leiden unter Speicherverknai^pung. Edward kann in diesem Fall die von Ihnen 
gewünschte Operation nicht korrekt ausführen. 

Abhilfe : Kurzfristig ist es sinnvoll für mehr Speicher zu sorgen, indem sie nicht mehr bendtigte 
Programme die momentan ebenfalls laufen beenden. Weiterhin können Sie Texte, die 
Sie nicht weiter bearbeiten möchten, mit „Frei“ aus dem „Text''-Menü wieder freigeben 
und hierdurch ebenfalls etwas Speicher gewinnen. 

Langfristig empfiehlt sich wohl die Anschaffung einer R.AM-Erweiterung. 

Meldung : „Kann Datei nicht öflfnen“ 

Ursache : Edward versuchte eine von Ihnen angegebene Datei zum Liden oder Speichern zu öff¬ 
nen. Dieser Versuch schlug fehl. Eine mögliche Ursache währe, daß diese Datei 
momentan von einem anderen Programm bearbeitet wird. Dies ist zum Beispiel mög¬ 
lich, wenn gerade ein Compiler diese Datei ütersetzt. 

Aldiilfe : In olxtn erwähntem Fall empfiehlt es sich, zu w'arten, bis der Compiler seine .Arbeit 
beendet hat und dann erneut zu versuchen, diese abzuspeichern. .Ansonsten sollten Sie 
versuchen die Datei unter einem anderen Namen, möglicherweise auch auf einem 
anderen kufwerk abzuspeichern. 

Meldung : „Kann nicht speichern“ 

Ursache : Beim Schreiben einer Datei schlug irgendetwas fehl. 

Abhilfe ; Überprüfen Sie, daß das l.aulwerk auf welchem Sie die Datei speichern wollten genü¬ 
gen Speicherplatz bietet und kein Schreibschutz aktiviert ist. Sollte dies nicht der Fall 
sein, so wechseln Sie das Laufwerk, oder deaktivieren den Schreibschutz. 




Anhani 


297 


Meldung : „Kann Info-Datei nicht speichern“ 

Ursache : Das Betriebssystem konnte die „.infb“-Datei zu Ihrem Text nicht erzeugen. 

Abhilfe : s. oben. 

Meldung : „Fehler beim Lesen“ 

Ursache : Vv^ahrend des lesens einer Datei trat ein Fehler auf. Möglicherweise sind Daten auf dem 
entsprechenden Laufwerk defekt. 

Airhilfe : Versuchen Sie mit einem Programm wie DiskDoctor zu retten, was noch zu retten ist. 
Viel Glück! 

Wenn Sie wie empfohlen fleißig Backups Ihrer Arbeiten gemacht haben, dann dürften 
Sie in dieser Situation nicht viel verloren haben. 

Meldung : „Konnte Datei nicht speichern“ 

Ursache : Beim speichern einer Datei schlug irgendetw'as fehl. 

.Airhilfe : s. „Kann nicht speichern“ 

Meldung : „Konnte Formular nicht öffnen“ 

Ursache : Edward versuchte ein von Ihnen gewünschtes Formular zu öffnen. Dies schien dem 

Betriebssystem nicht möglich zu sein. Normalerweise ist ein Mangel an freiem Speicher 
(insbesondere CHIP-Memcrry) an diesem Verhalten schuld. 

.Abhilfe ; Für freien Speicher sorgen (s. „Keinen Speicher mehr“). 



E-6 Eingabefehler 

Meldung : „Wrap-Position darf nicht kleiner als 10 sein!“ 

Ursache : Sie haben wahrscheinlich in der Kommandtrzeile eine Wrap-Position kleiner als 10 
Zeichen setzen wollen. Da dies nicht .sehr sinnvoll ist hat Edward dies unterbunden. 

Abhilfe : Eine Position größer oder gleich zehn Zeichen angeben. 

Referenz : Kapitel 3.9 „Word-Wrap“ 





MaxonPASCAL 


298 


Meldung : „Tabulatorwert nur zwischen 1 bis 20“ 

Ursache : Sie haben versucht einen Wert für die Größe des Tabulatorabstandes anzugeben, der 
als nicht sinnvoll erachtet wird. 

Abhilfe : Sinnvollen Wert zwischen Eins und Zwanzig angeben. 

Referenz : Kapitel III. „Eingabe und Bearbeitung von Texten“ Abschnitt 4) RETURN, ENTER und 
TAB 

Kapitel 3.15 „Globale Einstellungen“ .Abschnitt 1) „Das ‘Global Prefs’-Formular“ 

Meldung : ^Auflösungen nur im Bereich von 0 bis 2“ 

Ursache : Sie versuchten einen ungültigen Wert für den Display-Typ anzugeben. 

Abhilfe : Wert zwischen Null und Zwei angeben. 

Referenz : Kapitel 3-15 „Globale Einstellungen“ Abschnitt 1) „Das ‘Global Prefs’-Formular“ 

■Meldung : „Zeiten kleiner 30 Sek. machen keinen Sinn!“ 

Ursache : Die künstliche Intelligenz Edwards hält Intervalle unter dreissig Sekunden für die 
,Auto-Save“-Funktion für nicht besonders sinnvoll. Wahrscheinlich haben Sie einen 
Wert unter dreissig Sekunden nur aus Versehen angegeben. 

.Abhilfe : Werte größer dreissig angeben. 

Referenz : Kapitel 3.15 „Globale Einstellungen“ Abschnitt 1) „Das ‘Global Prefs’-Formular“ 

Meldung : jVutomode-Bercich nur von 0 bis 2!“ 

Ursache : Sie haben einen ungültigen Wert für den ,„Auto-Save“-Modus angegeben. 

Abhilfe : Wert zwischen Null und Zwei angeben. 

Referenz : Kapitel 3.15 „Globale Einstellungen“ Abschnitt 1) „Das 'Global Prefs’-Formular“ 

£-7 Fehler in den Definitionsdateien 

Als Referenz zu diesem Abschnitt empfiehlt es sich, das Kapitel XX. „Benutzerdefinierte Menüs, 
Tastaturbelegung und HotKey“ zu lesen. 




Anhang 


299 


Nteklung : „Präprocessor-Befehl zu komplex“ 

Ursache ; ln einer Defmiions-Datei, welche die Menüs und die Tastaturbelegung Edwards enthält 
trat eine übermälSig komplexe Verschachtelung von „#iP‘-Statements auf. Da Edward 
hier nur eine Tiefe von maximal 16 beherrscht, hat er hier das Handtuch geworfen. 

Al:)hilfe : Formulieren Sie ihre Definitons-Dateien etwas weniger komplex. Es erscheint schon 
fast unglaublich, daß Sie selbst diese Schachtelungstiefe verstehen können. 


Meldung : „#endif ohne #if‘ 

Ursache ; Sie haben ein #endif in ihrer Datei, zu dem kein #if gehört. 

Allhilfe : Überprüfen Sie die Datei noch einmal genau. 

Meldung : „Präprocessor-Befehl erwartet“ 

Ursache : Sie haben in der Datei ein „#''-Zeichen an einer Steüe verwendet, an welcher der 
Präprozessor dieser bearbeitet. Dieser erwartet nach dem „#“-Zeichen ein Statement 
(„if‘, „endif‘ oder „eise“). 

Abhilfe : Überiirüfen Sie die Datei. Entfernen Sie das Zeichen, oder ergänzen Sie das entspre¬ 
chende Statement. 


Meldung : „TITLE erwartet“ 

Ursache : Sic haben in der Datei versucht ein Menü zu definieren, daß jedoch keinen einzigen 
Titel enthält. 


Abhilfe 


Die entsprechende Stelle der Datei untersuchen. Vielleicht haben Sie den „T1T1J-“ 
Befehl j;i einfach nur vergessen. Sollten Sie zu den Puristen gehören, die vollständig auf 
Menüs verzichten können und alles mit der Tastatur machen, dann entfernen Sie auch 
noch den „MENU“-Befehl aus der Datei. 


Meldung : „Zu viele Menüeinträge“ 

Ursache : Sie haben versucht, ein Menü mit mehr als zwanzig Einträgen zu erzeugen. Dies ist lei¬ 
der nicht möglich. 

Allhilfe : Die Einträge auf mehrere Menüs verteilen. 



MaxonPASCAL 


300 


Meldung : „Zu viele Menütitel“ 

Ursache : Sie haben versucht, mehr als 16 Menüs zu erzeugen. Dies ist leider nicht möglich. 
.Abhilfe : Beschränken Sie sich etw'as in Ihren Menüs. 

E-8 Fehler beim Analysieren von Kommandos 

Fehlermeldungen in Definitions-Dateien oder in Kommandozeilen folgt immer eine Angaben der 
Position, an welcher der entsprechende Fehler auftrat. Die Fehlermeldungen haben daher folgen¬ 
den Form: 

1. Fehler 

In Zeile ; Zeile x Column: Spalte 

oder 

2. Fehler 

In Spalte: Spalte 

Meldung : „IDENTIFIER erwartet“ 

Ursache : Es wurde ein IDENTIFIER erwartet, aber nicht gefunden. 

Ein IDENTIFIER beginnt mit einem Buchstaben, gefolgt von einer beUebigen Anzahl 
alphanumerischer Zeichen (also Buchstaben und Ziffern) gemischt mit dem Unterstrich 

Meldung : „STRING erwartet“ 

Ursache : Es wurde ein STRING erwartet. Ein String beginnt mit einem Hochkomma („) gefolgt 
von einer beliebigen Anzahl Zeichen und wird mit einem Hochkomma abgeschlo.ssen. 

•Meldung : „NUMBER erwartet“ 

Ursache : An dieser Stelle wurde eine Zahl erwartet. 

Meldung : „( erwartet“ 

Ursache : Es wurde eine öffnende, runde Klammer erwartet. 



Anhani 


301 


Meldung : „) erwartet“ 

Ursache : Eine schliessende, runde Klammer wurde erwartet. 

Meldung : erwartet“ 

Ursache : Es wurde eine Semikolon erwartet. 

Meldung : „Kein Befehl“ 

W» Ursache : Es wurde ein Kommando aus Edw'ards Befehlsvorrat erwartet. 

Ahhilfc : Überprüfen Sie die Stelle. Wahrscheinlich haben Sie den Befehl nur falsch ausgeschrie¬ 
ben. 


Meldung : „LIST oder IDENTIHER erwartet“ 

Ursache : Es wmrde eine LIST oder ein IDENTIFIER erwartet, aber nicht gefunden. 

Eine LIST wird von runden Klammern umschlossen. Zwischen diesen können sich 
IDENTIFIER, STRINGs, NUMBERs, COMMANDs oder USTs auch gemischt befinden, 


Meldung : „LOBJECT erwartet“ 

Ursache : Es wurde ein LOBJECT erwartet. Ein LOBJECT kann ein STRING, eine NUMBER, ein 
COMMAN'D oder eine LIST sein. 

E-9 Fehlermeldungen beim Auswerten von Kommandos 



„LVAL erwartet“ 


Ursache ; Ein LVAl., das bedeutet eine Zahl wurde von einem Kommando als Argument erwartet. 


Meldung : „Zu viele Argumente“ 

Ursache : Ein Kommando wurde mit zuvielen Argumenten versorgt. 


Meldung : „Falsches Argument“ 

Ursache : Ein Kommando wurde mit falschen Argumenten versorgt. 






MaxonPASCAL 


302 


F) Kurzübersicht 

1.) Wort-Symbole (reserviert Pascal-Schlüsselwörter): 


AND 

AR RAY 

BEGIN 

OASE 

CONST 

DIV 

DO 

DOWNTO 

ELSE 

END 

FILE 

FOR 

FUNCTION 

GOTO 

IF 

IN 

LABEL 

MOD 

NIL 

NOT 

OF 

OR 

PROCEDURE 

PROGRAM 

PACKED 

RECORD 

REPEAT 

SE 

SHL 

SHR 

THEN 

TO 

TYPE 

UNTIL 

VAR 

WHILE 

WITH 

XOR 




Diese Liste entspricht (außer SHL, SHR und XOR) dem Jensen-Wirth-Standard. 


2.) Direktiven: 


ABSOLUTE 

FROM 

LIBRARY 

UNIT 


EXPORT 

IMPLEMENTATION 
MODU LE 
USES 


EXTERNAL FORWARD 

IMPORT INTERFACE 

OTHERWISE STATIC STRING 


Der Jensen-Wirth- (ISO 7185-) Standard kennt nur eine Direktive, nämlich FORWARD (die 
Direktives in diesein Sinn sind nicht zu verwechseln mit den Compiler-Direktiven wie z.B. 
{$ind...} 1) Direktiven sehen zw'ar auf den ersten Blick wie Wonsymbole aus, werden aber compile¬ 
rintern wie Bezeichner (Identifler) behandelt. 

Dadurch können sie z.B. vom Programmierer „überdefiniert“ werden, d. h. Sie können eine Variable 
„Forward“ cxler einen Datantypen „String“ nennen, letzteres wird in der Tat auch häufig in 
Standard-Pascal-Prngrammen getan („TYPE String=packed .\rray[l..xxx| of Char“ ist eine sehr 
Ixtliebte Deklaration). Aus diesem Grunde wurden auch die MaxonPASCAL-typischen 
Schlüsselwörter wie „STRING“ oder „LIBRARY' in Form von Direktiven realisiert. 


Anhan; 


303 


3.) Konstanten 

true 

false 

MaxInt = 32767 

MaxLong =2147483647 

MaxLongInt '=2147483647 
MaxCard = 65535 

MaxWord = 65535 

MaxShortCard = 255 
MaxByte = 255 

MaxShort =127 

MaxShortInt =127 

Pi =3.14159265358979 


4.) Typbezeichner 


a) Boolean = (false,true) 

b) Ganzzahltypen: 

Integer = -32768.. 32767 

Shortint = Short = -128.. 127 

Longint = Long = -2147483648.. 2147483647 

ShortCard = Bvie =()..255 

Cardinal = Word = ü.. 65535 


Char = chr(O).. chr(255) 

Real 

Text = FILE OF Char 

Str 

Ptr 



MaxonPASCAl, 


304 


5.) Variablen 
Input: text 
Output: text 
Sysbase: ptr Absolute 4 
DosBase: ptr 
MathBase: ptr 
MathTransBase; ptr 
FromWB: boolean 
RarameterStr: str 
ParameterLen: integer 
StartupMessage: ptr 

Mem : Array(O..MaxLongInt] Of Byte Absolute 0 


6.) Prozeduren 

AddExitServer (proc) 

Assign (datei,nanie) 

BlockRead (datei, variable, anzahl) 
BlockWrite (datei, variable, anzahl) 
Buffer (datei, bytes) 

CBreak 

ClrScr 

ClrEol 

Close (datei) 

CloseConsole (devpointer) 

CloseLib (libpointer) 

Close_Screen (screenhandle) 
Close_Window (windowhandle) 

Dec (ordinalvar) 

Delay (secs*50) 

Delete (stringvar, pos, len) 

DelLine 

Dispose (pointer) 

DisposeAll 
Error (String) 



Exchange (varl,var2) 

Free Mem (adresse,grosse) 

Get (datei) 

GotoXY (x,y) 

Inc (ordinalvar) 

Insert (string,stringvar,pos) 

InsLine New (pointer) 

OpenLib (pointervar, name, version) 
Rage ((datei)] 

Put (datei) 

Randomize 

Read (readpararaeterlist) 

ReadLN (readparameterlist) 
Reply_Msg (msg pointer) 

Reset (datei) 

ReWrite (datei) 

SetStdIO (consoleptr) 

Val (String, numvar, intvar) 

Write (writepararaeterlist) 

WriteLN (writeparameterlist) 
WriteCon (devpointer, string) 


7.) Funktionen 

Abs (numerisch): numerisch 

Addr (var): Longint 

AUoc_Mem (große,flags): Longint 

ArcTan (x): Real 

Break (n): Boolean 

ehr (int): Char 

Concat (strl, str2,...): String 

Copy (string, pos, len): Longint 

Cos (x): Real 

Eof [(datei)]: Boolean 

EoLN ((datei)]: Boolean 


MaxonPASCAL 


306 


Exp (x): Real 
FreeStack: Longint 
Get_Msg (port): Ptr 
Hi (i): Integer 
IntStr (long): String 
Length(string): Longint 
Ln (x): Real 
Lo (i): Integer 
Odd (int): Boolean 
OpenConsole (window): Ptr 

Open Screen (x,y,breite höhe,tiefe,hfarb,vfarb,mode,name): Ptr 

Open_Window(x,y,breite,höhe,färbe,IDCMP,flags,name, 

screen,minw,niinh,maxw,maxh): Ptr 

Ord (ordinal): Integer 

Pos (strl, str2): Longint 

Pred (ordinal): ordinal 

PwrlO (int): Real 

Random: Real 

Random (i): Integer 

ReadCon (devpointer): Char 

RealStr (r,i): String 

Round (x): Longint 

Sin (x): Real 

SizeOf (typ): Longint 

Sqr (numerisch): numerisch 

Sqrt (x): Real 

StrLen (string): Integer 

Succ (ordinal): ordinal 

Swap (i): Integer 

Upcase (ch): Char 

Wait (maske): Long 

Wait_Port (port): Ptr 



Index 


$link.1'» 

$paih.1^*’ 

Aljhrechcn.-9 

Abhiinpskdt. ü 

.ta. Ii7 

ABSOU ITE-Variablcn.93 

Alispiden.M 

AddExitScrver.Ki8 

AilcIIDCMP.238 

Acltlr.167 

ALink.31, 196 

Allocmii-m.128, 16(1 

AND.113 

Anhalten.63 

Anspringen.21 

■Anweisung-steil.löA 

Arlx'itsspeicher.32 

ArcTan.137 

AKexx-Befehlc.39 

ARcxx-Porl.37-38,81,28i 

addtx.“16 

addtxobj.iO 

aimpile.39 

ernirseripl.^1 

exefile.90 

gctinfu Make.90 

getinfc) STATE.90 

Info. 39 

leavemk.39 

loadmk.39 

MAX(7NI>.ASCAL.22 

newmk.39 

iibjectfile.90 

opaimp.39 

opcnmake.90 

opsys.39 

Optiun results.nO 

saveconf.90 

save,se.ssion.90 

SendAppCnmm.39 

setnpt.90 

ARexx-Sthniltstelle.37 

.Argument-String.39 

.Arrays.130, 139 

.ASCU-Zeichen.192 

.Assembler.!,..215 

As.sembleiTmxlul..39 

As,sign.143, 131-132 


Auflösung wählen.71 

Aufnehmen.63 

Aufzählung.121,138 

Auf/älilungs typen.121 

Ausfiihren.21,29 

Aus,schneiden.30 

Aasschnittstypen.121,138 

.Aaszcichnen.60 

Autoindent.61 

Auto-Save.72 

Autoren.2 

.Auttisave.33 

BACKSPACE.99 

BeginlO.297 

Benutzerdefinierte .Menüs.73 

Betriebssysterafunktinnen.1.39 

Bezeichner.88,207 

Binärtahlcn.113 

Bünk.31.196 

Block drucken.32 

liltK-'k einiesen.32 

Blockoperalionen 

Cut, Cupy, Paste.99 

Ein rucken.32 

laden, Sixtlchem, Drucken.31 

Spaltenblöcke.31 

Umwandeln.32 

BlockRead.199,136 

BlotkWrite.149,1% 

Blöcke.89 

Bcxikmarks.60 

Btxrlean.120,138 

Break.169 

Buffer.133 

Byte.113 

Cardinal.113 

C.ASE.108,133 

CBreak.163 

Char.121,138 

ehr.137 

CU.93 

Close.132 

CloseConsole.162 

Cltcselib.163 

Close_Dcvlce.297 

Close_Screen.162 

Close_Wlndt)w.I6l 

ClrEol.199 
































































































MaxonPASCAL 


308 


ClrScr.1^9 

Compiler-Anweisungen.175 

Compiler-Einstellungen.37 

Compiler-Fehlermeldungen. .56 

"Program“ expectcd.255 

Absolut variables must get.249 

Bttulean Expression expccted.249 

Dranch tou far.249 

Can not open mathieee.250 

Can not write unit.250 

Can'tcnpythisfile.250 

Can' t create direaories.250 

CASE necds an ordinal expresait)n250 

Compiler stack overflow.250 

Con not jump into a structure.250 

Constant expectcd.250 

DO expectcd.250 

Double dcfinition.250 

Double use of Idcntifier.250 

Element type is too large.251 

Error in string.251 

Error while reading unit.251 

Field identiricr expectcd.251 

Eile expected.251 

File Ls not of required Type.251 

File must be VAR paranieters.251 

File not found.251 

Fllenamc expected.251 

Filename tfX) long.251 

FlLEOFFlLELs not allowed.251 

First constant is higher than.251 

FOR needs an ordinal type.251 

Functions can rctum simple.252 

Garbagc at end of prugram.252 

Global pracedure wiihout.252 

Identifier expeaed.252 

Idcntifier nix defmed in that.252 

1MPLE.MNTATION expected.252 

Illegal assignment.252 

Illegal type for textfile input.252 

Illegal type for textfile output.252 

Incompaiible parameterlists.252 

Integer expression expected.253 

Label expei'ted.253 

label on wrong level.253 

Laufeeitfehler 

.Division by zeru.257 

.Error in Case.258 

.Error in CloseLib.258 

.Can ■ t open xxx.library.257 


.Exec error.258 

.Freemem feiied.258 

.Intuition error.258 

.Out of memory.258 

.Outof ränge.257 

.Overflow error.258 

.Suhscript out of ränge.257 

.User Break.258 

üb-base must be of Longlnt or... .253 

Magic number docs not match.253 

Memory overflow.253 

Name tixr long.253 

-Me free memnry for RSS-Hunk.253 

Ne free memory for relncation.253 

Ncsting overflow.253 

No free memnry for bulTer.253 

No free memory for unit.254 

Numeric expression expefled.254 

Offsets must be integer.254 

Only global Prix'edures can.254 

Ordinal Type expected.254 

Out of ränge.254 

Overflow at nesting of Incl-Iiles.254 

Overflow in floating-point.254 

Please set an unit directory.254 

Please use „Round“ or „Trunc“.254 

PROCEDERE or FUNCTION.254 

Short Circuit of Units.255 

Simple type expected.255 

String exceeds line.255 

String expression expected .255 

String too long.255 

Syntax error in Compiler dlrectivc.255 

Temporary string can not get.255 

THEN expected.255 

These types can not be convened 255 

This function identfier can not.255 

This Preedure can not be used.256 

To expected.256 

Type conflict.256 

Type conflict of Operands.256 

Type expectcd.256 

Type idcntifier expected.256 

Type-free |x)inter must not.256 

Unable tn 0(x.'n main flle.256 

Unexpeoed end of source.256 

Unit not found.256 

Unknown identifier or Syntax.257 

USES expected.257 

Variable expected.257 

Variable ixld address.257 















































































































Vi'lTü cxpects a variable nfa.257 

Wrong Index type.257 

Compiler-Schalter 

.Arithmetischer Überlauf..32 

Debugger-Datei.3.5 

Indexbercich.32 

Semikolon melden.32 

Stackgrbße.32 

Subrange testen.32 

Unterbrechen.32 

Compilermenüs. 24 

Compiling.26 

Concat.126,171 

Configuration Icon.72 

Copy.126,171 

Copyrights und Warenzeichen.2 

Cos.157 

CrcatcElxtlO.246 

CreatePnrt.246 

CreateStdIO.246 

Crt .235 

CnCnnsole.241 

CrtMessagc.239 

CrtRastPort.240 

CrtUserPon.241 

CrtWinckiw.240 

Datei.72 

Datei speichern.295 

Dateien.151 

Uateloperationen 

Laden.49 

Speichern.48 

Dateitypen.142 

Datentypen.113 

DbPwrlO.167 

Debugger.34 

Dec.171 

DRF.177 

Def-Datei laden.81 

Delay.168 

DELETE.44,172 

DeleteExtlO.247 

DeletePon.246 

DeleteStdlO.246 

Dell.ine.149 

Direktiven.302 

Display Beep.73 

DISPOSE.128,159 


DisposeAll.159 

DO.107-108 

Double.113,117 

DOIXOTO.107-108 

Drucke Zeilennummem.75 

EBNE.85,104 

EBNF-Darstellung.76 

Editor.42 

Editor-Fehlermeldungen 

(ersvartet.300 

) entartet.301 

Alles ist rückgängig gemacht.293 

Alles ist wiederhergestellt worden 293 

Altes Pictogramm ersetzen.295 

■Auflösungen nur im Bereich.298 

.Automode-Bereich nur von.298 

Cursor steht auf keinem.292 

Datei existiert bereits.295 

endif ohne if..299 

Falsches Argument.301 

Fehler beim Lesen.297 

Funktion würde Einfaltung.291 

Geänderten Text verwerfen.294 

IDENTIFIER erwanet.300 

Markierung gesetzt..290 

Kann Datei nicht öffnen.296 

Kann Info-Datei nicht speichern ...297 

Kann nicht speichern.296 

Kein Befehl.301 

Kein Block definiert.291 

Kein Pictogramm vorhanden.290 

Kein Speicher mehr.294, 296 


Konnte Backup nicht eizeugen.291 

Konnte Datei nicht speichern.297 

Konnte Formular nicht öffnen.297 

flSToder IDENTIFIER erwartet.301 


fVAL erwart et.301 

Markierung nicht gesetzt.291 

Menü ist zu groß fiir den Scrcen...293 

NUMBER erwanet.300 

Präprocessor-Befehl zu komplex .299 

Präprozessor Befeh erwanet.299 

Semikolon erwanet.301 

STRING envartet.300 

Strukturen stimmen nicht Überein293 

Suchmuster nicht gefunden.292 

Tabulatorweite nur zwischen.298 

Text ist geschützt.290 

TITUl erwanet.299 

Wrap-Position darf nicht.297 

Zeichenketc zu lang.292 




























































































MaxonPASCAL 


310 


Zeiten kleiner 30 Sek. machen.29R 


Zu Wele .Argumente.301 

Zu viele Menüeimräge.299 

Zu viele Menütitel.300 

Kditorkommandos.239 

Again.270 

AutriMtKie.283 

BackSpace.260 

IligStepDown.261 

BigStepUp.261 

BkxkHigher.269 

BlockLiwcr.269 

BlockSL.269 

BltK'kSR.269 


GoSuceFuld.273 

GoSuccKey.273 

GiituForm.280 

Iconify.289 

IndentReturn.261 

InfuForin.281 

InitTextRead.287 

InsertChars.289 

InsertFile.266 

Jump.271 

KillUne.260 

Mark.267 

MarkVert.267 

Modil>OldCtnd.282 

MuveDown.262 


...262 

...262 

...261 

...265 

...264 

...278 

...266 

...268 

...283 

...280 

...268 

...268 

...277 

...264 

...278 

...265 

..279 

..277 

..277 

..277 

..288 

..272 

..271 

..281 

..270 

..270 

..261 

..266 

..268 

..277 

..262 

..262 

..264 

....23 

..274 

..272 

..272 


Bot.263 .MoveLeft. 

Gopy.268 .MoveRight. 

Cut.267 MöveLIp. 

Oeletc.260 New. 

Display.282 NcwText. 

ITo.282 NewWin. 

F,ditFiirm.281 0|ien . 

KndTextRead.288 OpcnClip. 

EnterCmd.281 OpenlX*fs. 

ExecCIi.289 PageFnrm. 

ExecRexx.284 Paste. 

FjiecRexxString.284 Pa.steVert. 

Exit.279 PlayReeScript.... 

Find.270 PredText. 

FindForm.280 PredWin. 

FindRepForm.280 Print. 

FokI.272 Quit. 

Font.283 RecPlay. 

FreeText.264 RerStan. 

FreeWin...278 ReeStop.. 

FullSizeWin.279 ReDti. 

(jetBkxklnfo.286 RemFokl... 

GetUne.String.284 RemTab. 

GetSereenlnfo.287 RepeatCmd. 

GetTextlnfo.286 Replacc. 

GeiTexthist.285 ReplareAll. 

GetTextPri.s.285 Return. 

GetWindowLlst.285 Save. 

GetWord.284 SaveClip. 

GlobalForm.280 SaveRecScript.... 

GoBi lükMark.274 ScreenDown. 

GüDispPos.263 ScreenUp.. 

Go.MatchStruct.271 SelTextN. 

GoParseError.271 SendAppComm 

GiiPreclFnld.273 SetBonk.Mark.... 

GoPrcdKey.273 SetFi.ldsOff. 

GiiStringPas.263 SetFoldsOn. 








































































































Index 


311 



.2R9 


.275 


.275 

SetTab. 

.275 

SetWrap. 

.275 


.276 

SetWrapOn. 

.275 

ShowFoki. 

.272 

Split Hor'Jl'in. 

.279 

SpliiVerWin. 

.279 


.204 

SuccWin. 

.278 


.288 

ToggleKcv. 

.273 

Top. 

.263 


.288 


.260 




.267 


.276 



WrapText. 

.276 

Edward. 

.42 


77 

EinVAusgabcfehier. 

.185 

Einfügen. 

.50 

Einstellungen. 

.70 

ELSE. 

....106,109,177 

EniptylJT. 

.150 

Ende. 

.69 

ENDiF. 

.177 

Entferne Falte. 

.59 

EoF. 

.150 

Eüln. 

.150 

Error. 

.168.178 

Ersetzen. 

.55 

Erstelle Backup. 

.73 


.59 


.170 

Exe-Datei. 

.33 

Exit. 

.169 

EXP. 

.119,157 


.113 



Expiinentiaklarstellung.... 

.119 

EXPORT. 

.204 

external. 

.204 


.34 


.llXi 

Falsc. 

.120 

Falten. 

.57 

Falten überspringen. 

.75 

Farben . 

.71 




.26 


.34 

Feblermcidungen. 

.41 

Fehlerstellenansprung. 

.41 

Fenster 


Erzeugen. 

.65 

Mit ,4nsicbten arbeiten. 

.67 

Scblieläen. 


Wählen. 



.36 

Fertig. 

.26 

FlLEOFChar. 

.142 


.153 

Filepos. 

.154 

Filcxsize. 

.154 

FlieKkomma-Coprozessor. 

.117 


.113 

FontgröBe. 

.71 


.71 

FOR. 

.107 

Form Feed. 

.75 

FORWARD. 

.103,204 

FPi:. 

.117 

Frac. 

.167 


.128 


.165 

Free Mem. 

.161 

FromWB. 

.145 

FUNCTION. 

.101 

Funktionen.93,101,147,305 

ItiiR . 


Ganzzahl. 

.138 

Ganzzahltyp. 

.113 

Gehe zu Fehler. 

.56 




.119 

Get. 

.143,152 

Get Msg. 

.164 

Gleiipunkt 2 ahlen. 

.117 

GOTO. 

.111 

GotoXY. 

.149 


.53 


.31 

Halt. 

.168 


.31 

Hi . 

.166 


.121 

HolKev. 

.69,81 

Hunks. 

.197 

Iconily. 

.69 







































































































MaxonPASCAL 


Iriini meiigen. 33 


IF . 

.106 ,177 

IMPLEMENTATION., 

.204 

IMPORT. 

.204 

inc . 

.170 

Incl. 

. 175 

Indude. 

.175 

Indude-File.s. 

. 188 

Indudefiles. 

. 175 

Indexhereidi. 

.181 

Infdrmatiiin. 

.30 

Initialisierung. 

. 209 

Input. 

.145 

Insert. 

.172 

Insüne. 

.149 

Installation. 

.IR 

Integer. 

.113 

Interaktiv. 

. 221 

ImStr. 

.173 

lORe-sult. 

.143, 153 

ISÜ'Standard. 

..102 109 14(1 l=;i 

KeyDef.. 

.79 

KcyPressed. 

. 235 

Keys. 

.79 

Klammern Einzug. 

. 62 

Kleinbuchstaben. 

. 

Kommandüzeilen-Interpretcr. 70 

Kommentare.,. 

. 88 

Konfiguratioasdatei. 

. 35 

Konstanten. 

. 90 ,145 303 

Kopf. 

.74 

Kopieren. 

.50 

Label. 

.90 

Laden. 

. 75 

Laufzeit-Protokoll. 

. 34 

Laufzciifehlcr. 

. 257 

length. 

.172 

Lesezeidien. 

. 60 

Libraries. 

. 186 

Linker Error. 

.26 

Linker Rand. 

. 75 

Linkersteuerung. 

.179 194 

Linking. 

.26 

Literale. 

. 139 

Lizenzhc-dingungcn. 

.3 

LN .'L.''. 

.119.158 

Lu . 


Long. 

. 113 

I.unglnt. 

. 113 

LongReal. 

. 113 117 

Main File. 

. 31 

Make... 

.31,39,196,219 


Make-rnits. 3 I 

Makr(xs. 03 

Manlisst.113 

Markiea-n. 50 

MathBase. 143 

MalhlransBa.se .145 

Mem.146 

Menu. 77 

MenuGroup. 77 

Menultcm.78 

McasageReceived..236 

MiuleQualUst. 79 

Mcxiule. 191 ,205 

Näheningswen. 119 

NamcOfPaigram.241 

Neuer Flint. 71 

NEW.128,159 

NewUsi.246 

Nev.'Win(liiw.I 39 

NOT.115 

Numeri,sche Tyiien. 113 

Nummernixireidi. 75 

Objektdatoi. 33 

Objektdateien.I 94 

Oiid.158 

OpenConsole.162 

OpenUb. 163 

OpenScrecn.129 

OpenWindriw.I 39 

Open_Device.247 

0|)en_Scrcen.161 

Open_Windmv.160 

Optiunen. 179 

Optkinen sichern. 35 

OR .115 

Ord.158 

OTHERWISE.109 

OuiofMemriry.26 

Outpul.145 

Tage.149 

Parameter. 97 

ParamelerEen.34, 145 

ParameterStr. 34 ,145 

Piscal-Schlüsselwöner.302 

PASCALCa.235 

Path.176 

Pfad.73 

Puinier. 159 

Pointenypcn.128 

Pas.171 

Pred.158 

PROCEDURE.101 











































































































I’rogramnikupf.89 

Profirammslart.28 

Projekt & pjide.f'S 

Projekte.212 

Projekte erstellen.221 

Projeklvcrwalfuns.219 

.^hiinj'if’keiten.225 

Datei werhseln.227 

Dateien hinzufügen.224 

Externe Übersetzung.2,40 

I Itinrigemaehte .Maketlateicn.228 

Interne Übersetzung.227 

Internes Compilieren.229 

Komnientiire.2.'11 

Linkeraufruf.228 

Make.22 

inakefile.22 

Makros.2.11 

Projektpflege.226 

Hegeln.212 

ilhersetzen.224 

Übersetzung erzwingen.226 

Zeilenverbindung.2.10 

Prozeduraufnif.Il)5 

Prozeduren.93.147,304 

Prozedurparameter.102 

Prüfsumnien.210 

Pseudo-Bezeichner.101 

Put .143, 1S2 

IVrlfl.Iii7 

Quelltext-Veränderungen.28 

QuotecIString.77 

Random.165 

Randntnize.166 

Read.117, 148 

RcadCon.162 

ReadKey.235-2.36 

Readhn.149 

Real.113 

RealStr.173 

Realztthlen.113 

Rechengenauigkeit.113, 118 

Rechter Rand.62,75 

RECORD-Typ.110 

Records.130,1.39 

Redii.82 

REPFJ\T.107 

Reply_.\1sg .164 

Reset.143, 151 

Rewrite.143, 152 


Round.158 

Rundungsfehler.119 

Schachtel ung.206 

Scriillhereirh.73 

Seek.143,154 

SeekEoF.150 

SeekEoLN.150 

Seitenforraai.74 

Semikolon.88 

SET.129 

SetlDCMP.238 

Set.Mtxle.79 

SetStdIO.162,235 

Sill.115 

Short.113 

Short-Cuts.70 

ShortCard.113 

Shonint.113 

SHR.115 

SIN.119,158 

SizeOf.168 

S|-)eldicrn.75 

.Spezialsymbole.87 

Sqr.158 

SQRT.119,159 

.Stacküberlauf.182 

Standard-Units.235 

Startu pMessage.145 

STATIC.93,182 

■Stantti-Anzeige.43 

String-Konstanten.126 

Stringbehandlting.171 

Slringoptionen..36 

Stringry[x;n.123 

Strien.172 

Stiuktur-Check.55 

Strukturieren.57 

Strukturkontrolle.56 

SublDCMP.239 

Suhnmge.180 

Suce.159 

Suchen.53,55 

Supixin.2 

Swap.166 

.Symbole.87 

Syntax.85,104,192 

System.,30 

.Systemeinstellungen.33 

TAB in Space.s.61 

TAB Weite.62 

Temporärer String.126 







































































































MaxonPASCAL 


314 


Text 

Auswahl.46 

Daicken.47 

ErTeugen.46 

Freigeben.47 

laschen.47 

TextColms.241 

Textdraw.73 

Text Lines.241 

THEN.106 

Titelzeile.43 

TO .108 

Truc.120 

Tninc.159 

Typbezeichner.303 

Typdeftnition.91 

Typknnvertierungen.136 

Überladung.118 

Übersebreiben.61 

Übersetze CRs.62 

Llbersctzen.20 

IJndefined Ty|X’.256 

Undii.82 

Undo Konfiguration.72 

UndoUne.44 

Unit.203 

Units.191,201,205 

Unterbrechen.29,181 

UNTIl.107 

Upease.166 

IISES.203 

Val .174 

Variablen.145,198,304 

Variablendeklaration.92 

Variablenparameter.98 

Variante.135 

Veriiundanweisung.106 

Verbundtyp.131 

Vertauschen.55 

Venikal einfügen.51 

Vertikal markieren.51 

Vorwort.17 

Wait.163 

WaitForKey.236 

Wait_Pon.163 

Wettzuweisung.105 

WhereX.241 

WhercY.241 

VITOIE.107 

Wildcard..54 

WindnwClased.239 


WindowTitles.241 

WITH.110 

Word.113 

WordWrap.61 

Word-Wrap.62 

Workspace.32 

Wnrkspace overflow.26 

Wortsymbole.87 

Write.117,147 

WriteCon.162 

Writeln.148 

XOR.115 

Zeichenkette.126 

Zeige EOl.62 

Zeige Falte.59 

Zeige Spaces.62 

Zeige TABS.61 

Zeilen bis zum Text.74 

Zeilen nach dem Text.74 

Zeilen/Seite.74 

Zeilen/'Tcxt. 75 

Zeit.73 

Zum Anfang.74 

Zum Ende.75 













































































PASCAL 3 



rompllcr 

• $cl;r schjieile TLir aaroundicitcn 

• komfbrtabls Projckivenwllung (Make) 

• (ürekier iyalsasielleniTspreng 

• vdl in den Editor integntsi 

• übe ARest-SchniiBtdlc steuerbar 

• hdudes/Unia für AMIGA-OS o.l 
•speicherbsier Progratnmstatiis 

• kompilierte Programme sind auf allen 
Amiga laufBhig (A500 • AAOOO) 

• Unkfakig; ObjÄidateicn anderer Spra¬ 
che) we z.li Assembler, C'C". 
MaxonllASIC oder Moduh können 
daugebunden werden 

• weitgehend kompatibel zu Borland 
Turbo Pascal 5.0 

Milor rEI)».SRÜ) 

• .Multi-VfJndow-lfcdinik 

• beliebig viele Tbiic gleichzeitig bear¬ 
beitbar (spelchcrabhänig) 

• Falten von Texipassagen 

• lasiatur und Menüfunkiionen frei 
belegbar 

• definierbare yjktos 
•umfrmgreicbe UNDO-Möglichkelten 

• .Autosave- und Backup-Modus 

• speicherbarer Programmsiatus 
•ARcw-Schnittsiclle 

Hibliullii'kcn 

• CRI'-UNIT (eigene Konsole. XeyPres- 
sed. ReadKcy, VPaiiFotKey) 

• PASCALCrt-UNIT (im Source) 

• SVSTEM-'J.NTT (l’nii der System-Inclu- 
de-Dateien des Amiga nut allen Dekla¬ 
rationen von Konstanten, Datentypen 
u.nd library-Fjnktio.nen für den vollen 
Zugriff auf das Betriebssystem) 


Der neue PASCAL-Coinpiler 

MaxonPASfbM. baüf auf dem Jen- 
senAVtnh Standard auf, ist jedoch um 
sehr viele leLstungsfähigc Funktionen 
und Prozeduren erweitert worden. 
Dies betrifft in erster Linie Datei-, 
String- und .AMIGA-typische Funktio¬ 
nen. 

Compiler linker 

Compiler und Linker .sind voll in das 
System integriert. Dadurch entläilen 
sämtliche Nachladezeiteni Die Mög- 
lldtkeit, alle benötigten Inciude- 
Dateien 'ncim ersten Compifer-Lauf in 
die RAM-Disk zu kopieren, erhöht die 
Turnaround-Zelten enorm. Im Schnitt 
compiliert das System 20.000 Zeilen 
pro Minute. 

Units 

Eine der wichtigsten .Möglichkeiten 
von MaxonPASCAl. ist das.üNlT-Kon- 
zept. Es untersetzt ilen m.oduiaren 
Aulbau von Programmen durch Ausla- 
gern von Routinen. Die einzelnen 
Quelltextc Ihrer Programme werden 
dadurch kürzer und übersichtlicher. 
Fertige Units werden vorcompillen 
und bei weiteren Compilerläufen nur 
noch dazugelinkt. Dies bringt einen 
enormen Geschwindigkeitsgewinn. 
Auch die AMIGA Sysiem-lndudes zu 
AMIGA OS 3.1 werden als Uniis mit- 
gdiefert. 


AliilGA’ 



Eiasteiger und I msieigcr 

MaxonP.ASC.AL ist das ideale System 
für Einstdger und Umsteiger Zum 
einen ist P.ASCAL die ideale Sprache 
um das Programmieren zu erlernen 
und zum anderer, ist .MaxonPjASCAL 
der Compiler, der durch seine extrem 
cinbiche Bedienung den Ein- oder 
Umstieg sdir leicht macht 

Includcs für OS 3-1 

MaxonPASCAL bietet zudem den ein¬ 
fachen Zugriff auf die AMIGA- 
Betriebssysiemfunktionen aller Ver¬ 
sionen bis zu OS 3.1. Die 
entsprechenden Indudes und Units 
werden mitgdiefert. Damit ist es 
'-Jedem möglich, den AMIGA unter 


allen verfügbaren Beinebssysiemen 
wie ein Pro3 zu programmieren. 


F.nvciierbar 

MaxonPASCAl. Ist ein offenes System, 
das Sie nach Bdicben erweitern kön¬ 
nen. Mögliche Zusätze sind z.B. das 
Hilfesystem HOTHELP 3, der Assem¬ 
bler .MaxonASM oder Make.APP, ilas 
Werkzeug zum mausgesteuerten 
Eßtcllen von Programmoberfiachen. 


Die SysicmvorausJHKen sind ein 
■AMIGA (A500- .AfOOO^t mindestens 
2 MB RAM. .A\UG.\-OS 1.3 bis 3.1 und 


zwei Diskettenlaufwerken. Ein Fest- 
plaitenlauhverk wird empfohlen 



.MAXON CompuierGmbil * InüiLMricstr. Z6 mm 
D-bSTbOEschborn • TcWonObiyt.A81811 

Inmn»:ri.nd V.- fCOmpUfPr